Differential Gene Expression
Construction of the Design Matrix
samples <- data.frame(
lapply(colnames(testFinalGeneFilter), FUN=function(x){
unlist(strsplit(x, split = FALSE))[c(2,3)]
}
))
colnames(samples) <- (colnames(testFinalGeneFilter)[3:14])
#removes the empty column
samples <- subset(samples, select = -c(13, 14))
rownames(samples) <- c("sample_expression", "sample_group")
samples[is.na(samples)] <- 0
#fill in the sample expression type, if they are sgACC or MDD
samples[1,] <- c("sgACC_MDD", "sgACC_control", "sgACC_control", "sgACC_control", "sgACC_MDD", "sgACC_MDD", "sgACC_control", "sgACC_control", "sgACC_MDD", "sgACC_control", "sgACC_MDD", "sgACC_MDD")
#fill in the sample_cell type, if they are a control or not.
samples[2,] <- c("MDD","control","control","control","MDD","MDD","control","control","MDD","control","MDD","MDD")
samplesMat <- as.matrix(samples)
geneSymID <- testFinalGeneFilter[1:2]
expDesign <- testFinalGeneFilter
# create groups matrix:
expGroups <- as.data.frame(cbind(response = expDesign$header))
# Some experimental design information was incorrectly entered in the downloaded metadata file, so this information was manually entered based on paper figures:
expGroups <- as.data.frame(rbind(expGroups, samples))
designedd <- data.frame(lapply(colnames(normalized_counts_pmil), function(x) {
gsub("\\d", "", unlist(strsplit(x, "_")))
}))
rownames(designedd) <- rownames(samples[1,])
rownames(designedd) <- rownames(samples[2,])
colnames(designedd) <- colnames(normalized_counts_pmil)
expDesign <- testFinalGeneFilter
expGroups <- as.data.frame(cbind(response = expDesign$header))
expGroups <- as.data.frame(rbind(expGroups, samples))
designedd <-expGroups
design2 <- data.frame(t(designedd))
knitr::kable(design2, type="html")
| CRH-Hu1001 |
sgACC_MDD |
MDD |
| CRH-Hu1031 |
sgACC_control |
control |
| CRH-Hu1047 |
sgACC_control |
control |
| CRH-Hu1086 |
sgACC_control |
control |
| CRH-Hu513 |
sgACC_MDD |
MDD |
| CRH-Hu600 |
sgACC_MDD |
MDD |
| CRH-Hu615 |
sgACC_control |
control |
| CRH-Hu789 |
sgACC_control |
control |
| CRH-Hu809 |
sgACC_MDD |
MDD |
| CRH-Hu852 |
sgACC_control |
control |
| CRH-Hu863 |
sgACC_MDD |
MDD |
| CRH-Hu943 |
sgACC_MDD |
MDD |
Table 1. Shows the design matrix for the samples, stating the sample’s expression type and its grouping. The controls are control individuals who do not have Major Depressive Disorder (MDD), while those labelled with MDD have MDD.
Corrected MDS plot
snames <- colnames(testFinalGeneFilter)[3:14]
d <- testFinalGeneFilter[3:14]
groupss <- interaction(snames, samplesMat["sample_group", ])
plotMDS(d, col=as.numeric(groupss), main="MDS plot of Norm. RNASeq Samples for GSE193417")

Figure 1. An MDS plot, i.e. multidimensional scaling points, which have already been accounted for with the correct log base due to the “edge” fixing, are a way of showing how the NR and R groups of any experiment interact with one another, as well as with other samples from the same organism, different organisms, different ages, and so on. There is over a half-fold difference between the two values, the first being the control group for this study, those who are not affected by Major Depressive Disorder (MDD), and the second being those who are affected by MDD. CRH+ cells in human sgACC are a diverse population of GABAergic interneurons, despite the fact that they predominantly co-express VIP. Our findings suggest that MDD is associated with decreased inhibitory function indicators in sgACC CRH+ interneurons, and they add to the growing body of evidence that MDD causes changes in GABAergic function in the cortex. We can see from the results that there is a lot of variation between controls and non-controls, but those who have MDD or don’t have MDD tend to cluster around the same area of the plot. This does imply that there are genes responsible for the responses observed by individuals and researchers. One thing that would be great to see in a plot like this is obviously a lot more samples, as 6 samples per group seems insufficient, as the researchers pointed out in their paper.
Density Curve for Normalized Distribution Values
ctsDenct <- apply(log2(edgeR::cpm(normalized_datastruct[,3:14])), 2, density)
dataplot2 <- c(colnames(samples))
xlim <- 0; ylim <- 0
for (i in 1:length(ctsDenct)) {
xlim <- range(c(xlim, ctsDenct[[i]]$x));
ylim <- range(c(ylim, ctsDenct[[i]]$y))
}
cols <- rainbow(length(ctsDenct))
ltys <- rep(1, length(ctsDenct))
plot(ctsDenct[[1]], xlim = xlim, ylim = ylim, type = "n", ylab = "Smoothing density of log2-CPM", main = "Normalized Distribution Values for GSE193417", cex.lab = 0.85)
for (i in 1:length(ctsDenct))
lines(ctsDenct[[i]], col = cols[i], lty = ltys[i])
legend("topright", legend = dataplot2, col=cols, lty=ltys, cex=0.75, border="blue", text.col = "green4", merge = TRUE, bg = "gray90")

#Remember to add in the figure name, number and description.
Figure 2. A normalized distribution curve The density curves are another way to analyse our data before and after the normalisation process; because they are proportional to the size of the data set, they work particularly well with larger data sets. The more data we can add to this curve, the better we’ll be able to predict and model it. While outlines and data that do not match the average are more than likely to affect the extreme ends of the curve, we can still deduce that those who suffer from MDD will find someone with whom they can comfortably align themselves. The more data we can add to this curve, the better we’ll be able to predict and model it. The higher curves for the youngest and oldest of the group in this data set and these samples specifically. While there are a few points where the difference in the variable values mapped against the curve falls short of the non-normalized graph, the normalised graph lacks extra values, repetitions are the most likely culprit because they count for twice as much as they should.
Normalized Data Strucutre
knitr::kable(t(normalized_datastruct[1:5,]), type="html",)
| ensembl_gene_id |
ENSG00000000003 |
ENSG00000000419 |
ENSG00000000457 |
ENSG00000000460 |
ENSG00000000971 |
| hgnc_symbol |
TSPAN6 |
DPM1 |
SCYL3 |
C1orf112 |
CFH |
| CRH-Hu1001 |
0.000000 |
9.575111 |
0.000000 |
0.000000 |
0.000000 |
| CRH-Hu1031 |
10.657725 |
14.498347 |
46.951601 |
3.168513 |
0.000000 |
| CRH-Hu1047 |
0.6299757 |
0.0000000 |
15.2769115 |
4.0160953 |
11.1820693 |
| CRH-Hu1086 |
0.00000000 |
0.08828009 |
31.16287262 |
2.64840277 |
0.17656018 |
| CRH-Hu513 |
15.561174 |
5.227582 |
45.954092 |
18.965181 |
1.945147 |
| CRH-Hu600 |
11.3993735 |
0.0000000 |
5.4588549 |
0.1605546 |
0.0000000 |
| CRH-Hu615 |
0.000000 |
18.436284 |
58.255289 |
15.994949 |
1.346943 |
| CRH-Hu789 |
8.393148 |
0.000000 |
25.688120 |
37.260491 |
24.670769 |
| CRH-Hu809 |
9.2910323 |
8.1761084 |
0.1238804 |
21.5551949 |
6.1940215 |
| CRH-Hu852 |
0.0000000 |
4.6425067 |
0.8500364 |
13.1428712 |
0.0000000 |
| CRH-Hu863 |
5.491062 |
41.787916 |
31.829548 |
0.000000 |
1.489102 |
| CRH-Hu943 |
0.00000 |
15.83270 |
22.83562 |
21.82071 |
27.80871 |
NA
Table 2. A table that shows the completed normalized data structure for this dataset, with matching ensemble gene IDs, and HGNC symbols for each of the samples. This data structure was one of the intended final products of Assignment 1. The object is called normalized_datastruct.
Differential Gene Expression on Normalized Dataset
design_model <- model.matrix(~ design2$sample_expression)
minimal_set <- ExpressionSet(normalized_counts_pmil)
fit <- limma::lmFit(minimal_set, design_model)
fit2 <- limma::eBayes(fit, trend=TRUE)
topfit <- limma::topTable(fit2, coef=ncol(design_model), adjust.method="BH", number=nrow(normalized_counts_pmil))
# Add the gene symbols
output_hits <- merge(
data.frame(gene = geneSymID, row.names = rownames(normalized_counts_pmil)),
topfit,
by=0,
all=TRUE
)
# Sort by unadjusted p-value
output_hits <- output_hits[order(output_hits$P.Value, decreasing = FALSE),]
output_hits
Table 3. A table that shows the first 10 genes with the lowest P-values of the dataset. This table is ordered, by the P.value attribute and starts with the lowest P.value and goes to the largest P.value.
Volcano Plot
vol_plot <- output_hits
vol_plot$diffexpressed <- "Not Significant"
# if logFC > 1 and P.Value < 0.05, set as "Up Regulated"
vol_plot$diffexpressed[vol_plot$logFC > 1 & vol_plot$P.Value < 0.05] <- "Up Regulated"
# if logFC < -1 and P.Value < 0.05, set as "Down Regulated"
vol_plot$diffexpressed[vol_plot$logFC < 1 & vol_plot$P.Value < 0.05] <- "Down Regulated"
# Create a new column "delabel" to vol_plot, that will contain the name of genes differentially expressed (NA in case they are not)
vol_plot$delabel <- NA
vol_plot$delabel[vol_plot$diffexpressed != "Not Significant"] <- vol_plot$gene.hgnc_symbol[vol_plot$diffexpressed != "Not Significant"]
ggplot(data=vol_plot, aes(x=logFC, y=-log10(P.Value), col=diffexpressed, label=delabel)) +
geom_point() +
theme_minimal() +
geom_text_repel() +
scale_color_manual(values=c("blue", "black", "purple")) +
geom_vline(xintercept=c(-1, 1), col="red") +
geom_hline(yintercept=-log10(0.05), col="red") +
labs(title="All differentially expressed genes with a p-value < 0.05 for GSE193417")

Figure 3. A volcano plot that shows the single upregulated gene, MT-CO1 and the 6 downregulated genes GAS6, CCDC93, METRN, TAF1, GAK, WIF1.
MA plot
limma::plotMA(minimal_set, status=output_hits$P.Value < 0.05, main="Differentially expressed genes with a p-value < 0.05 for GSE193417")

Figure 4. Matches up with the volc plot, they are just graphical translations of each other. The points, and spread all match up.
Heatmap
#Get the rownames of each of the genes that satisfy the threshold.
topHitHM <- output_hits$Row.names[output_hits$P.Value < 0.05]
#Get the sections of the data that are also in the specified threshold.
heatmap_matrix_tophits <- t(scale(t(normalized_counts_pmil[which(rownames(normalized_counts_pmil) %in% topHitHM),])))
#
heatmap_col <- circlize::colorRamp2(c(min(heatmap_matrix_tophits), 0, max(heatmap_matrix_tophits)), c("blue", "white", "red"))
heatmap <- ComplexHeatmap::Heatmap(as.matrix(heatmap_matrix_tophits), name = "gene expr. value",
cluster_rows = TRUE, show_row_dend = TRUE,
cluster_columns = TRUE,show_column_dend = TRUE,
col=heatmap_col,show_column_names = TRUE,
show_row_names = FALSE,show_heatmap_legend = TRUE,
column_title = "Heatmap of diff. expressed genes with a p-value < 0.05 for GSE193417")
heatmap

Figure 5 is a heatmap of differentially expressed genes within the dataset, with the samples being represented along the bottom of the heatmap. Good clustering and consistent clustering between the samples. There is consistent banding and clustering of colours as well. If you divide the heatmap horizontally, right along the 0 of the heatmap, you can separate it into two halves for every sample, a top half that has a significant colour palette and a bottom half with another different signficant colour palette. For the most part, each half of the sample is dominated by either purple-ish or orange-ish colour. For example, CRH-Hu1001 is a sample that suffers with MDD, the top half is primarily purple, whilst the bottom half is primarily orange. This pattern where the top is purple and the bottom is orange is consistent across all MDD samples, and for controls, like CRH-Hu1031 the top half is primarily orange, whilst the bottom half is primarily purple.
Answers to Questions
- Calculate p-values for each of the genes in your expression set. b) How many genes were significantly differentially expressed? c) What thresholds did you use and why?
- For the p-values for each of the genes in the expression set, please see Table 3.
- 608 or 3.9632358% of the 15341 normalized and cleaned genes.
- I did not use any thresholds to limit the data in this portion. My reasoning for doing this is because based on the number of genes that passed the significant differential expression already being under the P-value threshold of 5%, I found it unnecessary. It doesn’t make sense to further limit the values and data when it already is under the range to reject the null hypothesis. Meaning that there are genes with strong differential expression, and in this case it is 608 of them. Now, we can adjust for any irregularities and perform some hypothesis corrections. Though to clarify, I am making my P.Value threshold of 0.05, as this is 5%, enough to reject the null hpothesis, signifying strong differential expression as I stated before, but beyond this threshold, I did not have another as it was not required as stated earlier. So, threshold was P.Value < 0.05, but nothing further.
- Multiple hypothesis testing - correct your p-values using a multiple hypothesis correction method.
- Which method did you use? And Why? b) How many genes passed correction?
- The method I used was the Benjamini-Hochberg (BH) correction method. This is mainly due to the fact that it is the most widely used of the methods, it works really well for smaller sample sizes, which is the case for us, with data set, and lastly it is the most lenient of the P-value adjustment methods. Since the sample size is so small, we might not have much variation. Though, due to this method, 0 genes passes correction, which is interesting to say the least.
- The number of genes that passed correction is: 0.
Show the amount of differentially expressed genes using an MA Plot or a Volcano plot. Highlight genes of interest. For this question please see Figure 4 and Figure 5 above, an MA Plot and Volcano plot respectively. Please pay special note to the Volcano plot, where it highlights the genes; downregulated, GAS6, CCDC93, METRN, TAF1, GAK, WIF1 and up regulated, MT-CO1 data points. This is really interesting because these “stars” perse are much further out that the rest of the cluster of the dataset. In the MA plot, you can see the outliers simply signifed as dots, as the MA plot and Volcano plot are graph translations, graphed on the anti-axis of one another. You can see the very similar grouping structure around the origin of each graph. In the MA plot, the scatter is more spread out due to the larger scale resulting from the change base, of log2 to log10, and the average of said log expressions. Both essentially represent the same thing, that there are a major number of genes that are expressed with a P-value of less than 0.05. For both plot, False or insignificant values are represented in black colour. The Volcano plot is just differentiating between up or down regulatiion for the True values. With this in mind, and the redundancy further supporting my claims, we can conclude that there is most likely gene strong differential gene expression.
Visualize your top hits using a heatmap. Do you conditions cluster together? Explain why or why not. Yes there is a clear clustering due to the conditions of the experiment, and sample type. Those that have MDD and those that are controls have very similar gene expressions. Please see Figure 5’s description for more information. In summation of the description, those with MDD have a unique colour pattern on the heatmap, and individuals with said pattern can be identified that way (purple-ish top, orange-ish bottom). Similarly, individuals that do not suffer from MDD have a unique pattern purple-ish bottom, orange-ish top. What this basically states is that there is a clear relationship between the genes and their effects. Pretty interesting that there is also a visual similarity. However, I should note that this might just be a coincidence and like stated in the paper as well as in A1, a larger sample size could have made the relationship more or less apparent. Still a pretty neat thing! So in short, the purple means there is downregulated expression and the orange means there is upregulated expression for the respective genes.
Citations
Bonnin, S. (2022). 19.11 Volcano plots | Introduction to R. Biocorecrg.github.io. Retrieved 13 April 2022, from https://biocorecrg.github.io/CRG_RIntroduction/volcano-plots.html.
Cotter, D., Mackay, D., Landau, S., Kerwin, R., & Everall, I. (2001). Reduced Glial Cell Density and Neuronal Size in the Anterior Cingulate Cortex in Major Depressive Disorder. Archives Of General Psychiatry, 58(6), 545. https://doi.org/10.1001/archpsyc.58.6.545
Differential Expression with Limma-Voom. Ucdavis-bioinformatics-training.github.io. (2022). Retrieved 13 April 2022, from https://ucdavis-bioinformatics-training.github.io/2018-June-RNA-Seq-Workshop/thursday/DE.html.
Duan, E. (2022). R|Py notes: Volcano plots with ggplot2. R|Py notes. Retrieved 13 April 2022, from https://erikaduan.github.io/posts/2021-01-02-volcano-plots-with-ggplot2/.
Falcon, S., & Gentleman, R. (2006). Using GOstats to test gene lists for GO term association. Bioinformatics, 23(2), 257-258. https://doi.org/10.1093/bioinformatics/btl567
Geistlinger, L., Csaba, G., Santarelli, M., Ramos, M., Schiffer, L., Turaga, N., Law, C., Davis, S., Carey, V., Morgan, M., Zimmer, R., & Waldron, L. (2021). Toward a gold standard for benchmarking gene set enrichment analysis. Briefings in bioinformatics, 22(1), 545–556. https://doi.org/10.1093/bib/bbz158
Huang, D., Sherman, B., & Lempicki, R. (2008). Bioinformatics enrichment tools: paths toward the comprehensive functional analysis of large gene lists. Nucleic Acids Research, 37(1), 1-13. https://doi.org/10.1093/nar/gkn923
Lin, L., & Sibille, E. (2013). Reduced brain somatostatin in mood disorders: a common pathophysiological substrate and drug target?. Frontiers In Pharmacology, 4. https://doi.org/10.3389/fphar.2013.00110
Oh, H., Newton, D., Lewis, D., & Sibille, E. (2022). Lower Levels of GABAergic Function Markers in Corticotropin-Releasing Hormone-Expressing Neurons in the sgACC of Human Subjects With Depression. Frontiers In Psychiatry, 13. https://doi.org/10.3389/fpsyt.2022.827972
Peng, R. (2022). R Programming for Data Science. Bookdown.org. Retrieved 13 April 2022, from https://bookdown.org/rdpeng/rprogdatascience/.
Shelton, R., Claiborne, J., Sidoryk-Wegrzynowicz, M., Reddy, R., Aschner, M., Lewis, D., & Mirnics, K. (2010). Altered expression of genes involved in inflammation and apoptosis in frontal cortex in major depression. Molecular Psychiatry, 16(7), 751-762. https://doi.org/10.1038/mp.2010.52
Steipe, B., & Isserlin, R. (2022). BCB420 - Computational System Biology. Bcb420-2022.github.io. Retrieved 13 April 2022, from https://bcb420-2022.github.io/General_course_prep/index.html#attributions.
Steipe, B., & Isserlin, R. (2022). BCB420 - Computational System Biology. Bcb420-2022.github.io. Retrieved 13 April 2022, from https://bcb420-2022.github.io/R_basics/.
Steipe, B., & Isserlin, R. (2022). BCB420 - Computational System Biology. Bcb420-2022.github.io. Retrieved 13 April 2022, from https://bcb420-2022.github.io/Bioinfo_Basics/.
Lecture modules: https://q.utoronto.ca/courses/248455/modules
Uku Raudvere, Liis Kolberg, Ivan Kuzmin, Tambet Arak, Priit Adler, Hedi Peterson, Jaak Vilo: g:Profiler: a web server for functional enrichment analysis and conversions of gene lists (2019 update) Nucleic Acids Research 2019; doi:10.1093/nar/gkz369 [PDF].
citation("tidyverse")
Wickham et al., (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686, https://doi.org/10.21105/joss.01686
A BibTeX entry for LaTeX users is
@Article{,
title = {Welcome to the {tidyverse}},
author = {Hadley Wickham and Mara Averick and Jennifer Bryan and Winston Chang and Lucy D'Agostino McGowan and Romain François and Garrett Grolemund and Alex Hayes and Lionel Henry and Jim Hester and Max Kuhn and Thomas Lin Pedersen and Evan Miller and Stephan Milton Bache and Kirill Müller and Jeroen Ooms and David Robinson and Dana Paige Seidel and Vitalie Spinu and Kohske Takahashi and Davis Vaughan and Claus Wilke and Kara Woo and Hiroaki Yutani},
year = {2019},
journal = {Journal of Open Source Software},
volume = {4},
number = {43},
pages = {1686},
doi = {10.21105/joss.01686},
}
citation("edgeR")
See Section 1.2 in the User's Guide for more detail about how to cite the different edgeR pipelines.
Robinson MD, McCarthy DJ and Smyth GK (2010). edgeR: a Bioconductor package for differential expression analysis of digital gene expression data. Bioinformatics 26, 139-140
McCarthy DJ, Chen Y and Smyth GK (2012). Differential expression analysis of multifactor RNA-Seq experiments with respect to biological variation. Nucleic Acids Research 40, 4288-4297
Chen Y, Lun ATL, Smyth GK (2016). From reads to genes to pathways: differential expression analysis of RNA-Seq experiments using Rsubread and the edgeR quasi-likelihood pipeline. F1000Research 5, 1438
To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set 'options(citation.bibtex.max=999)'.
citation("GEOmetadb")
Please cite the following if utilizing the GEOmetadb software:
Zhu Y, Davis S, Stephens R, Meltzer PS, Chen Y. GEOmetadb: powerful alternative search engine for the Gene Expression Omnibus. Bioinformatics. 2008 Dec 1;24(23):2798-800. doi: 10.1093/bioinformatics/btn520. Epub 2008
Oct 7. PubMed PMID: 18842599; PubMed Central PMCID: PMC2639278.
A BibTeX entry for LaTeX users is
@Article{,
author = {Yuelin Zhu and Sean Davis and Robert Stephens and Paul S. Meltzer and Yidong Chen},
title = {GEOmetadb: powerful alternative search engine for the Gene Expression Omnibus.},
journal = {Bioinformatics (Oxford, England)},
year = {2008},
month = {Dec},
day = {01},
volume = {24},
number = {23},
pages = {2798--2800},
abstract = {The NCBI Gene Expression Omnibus (GEO) represents the largest public repository of microarray data. However, finding data in GEO can be challenging. We have developed GEOmetadb in an attempt to make querying the GEO metadata both easier and more powerful. All GEO metadata records as well as the relationships between them are parsed and stored in a local MySQL database. A powerful, flexible web search interface with several convenient utilities provides query capabilities not available via NCBI tools. In addition, a Bioconductor package, GEOmetadb that utilizes a SQLite export of the entire GEOmetadb database is also available, rendering the entire GEO database accessible with full power of SQL-based queries from within R.},
issn = {1367-4811},
doi = {10.1093/bioinformatics/btn520},
url = {http://www.ncbi.nlm.nih.gov/pubmed/18842599},
language = {eng},
}
citation("RColorBrewer")
To cite package ‘RColorBrewer’ in publications use:
Erich Neuwirth (2022). RColorBrewer: ColorBrewer Palettes. R package version 1.1-3.
A BibTeX entry for LaTeX users is
@Manual{,
title = {RColorBrewer: ColorBrewer Palettes},
author = {Erich Neuwirth},
year = {2022},
note = {R package version 1.1-3},
}
citation("ggplot2")
To cite ggplot2 in publications, please use:
H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.
A BibTeX entry for LaTeX users is
@Book{,
author = {Hadley Wickham},
title = {ggplot2: Elegant Graphics for Data Analysis},
publisher = {Springer-Verlag New York},
year = {2016},
isbn = {978-3-319-24277-4},
url = {https://ggplot2.tidyverse.org},
}
citation("readxl")
To cite package ‘readxl’ in publications use:
Hadley Wickham and Jennifer Bryan (2022). readxl: Read Excel Files. https://readxl.tidyverse.org, https://github.com/tidyverse/readxl.
A BibTeX entry for LaTeX users is
@Manual{,
title = {readxl: Read Excel Files},
author = {Hadley Wickham and Jennifer Bryan},
year = {2022},
note = {https://readxl.tidyverse.org, https://github.com/tidyverse/readxl},
}
citation("dplyr")
To cite package ‘dplyr’ in publications use:
Hadley Wickham, Romain François, Lionel Henry and Kirill Müller (2022). dplyr: A Grammar of Data Manipulation. https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr.
A BibTeX entry for LaTeX users is
@Manual{,
title = {dplyr: A Grammar of Data Manipulation},
author = {Hadley Wickham and Romain François and Lionel Henry and Kirill Müller},
year = {2022},
note = {https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr},
}
citation("AnnotationDbi")
To cite package ‘AnnotationDbi’ in publications use:
Hervé Pagès, Marc Carlson, Seth Falcon and Nianhua Li (2021). AnnotationDbi: Manipulation of SQLite-based annotations in Bioconductor. R package version 1.56.2. https://bioconductor.org/packages/AnnotationDbi
A BibTeX entry for LaTeX users is
@Manual{,
title = {AnnotationDbi: Manipulation of SQLite-based annotations in Bioconductor},
author = {Hervé Pagès and Marc Carlson and Seth Falcon and Nianhua Li},
year = {2021},
note = {R package version 1.56.2},
url = {https://bioconductor.org/packages/AnnotationDbi},
}
ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and may need manual editing, see ‘help("citation")’.
citation("limma")
Please cite the paper below for the limma software itself. Please also try to cite the appropriate methodology articles that describe the statistical methods implemented in limma, depending on which limma functions you
are using. The methodology articles are listed in Section 2.1 of the limma User's Guide.
Ritchie, M.E., Phipson, B., Wu, D., Hu, Y., Law, C.W., Shi, W., and Smyth, G.K. (2015). limma powers differential expression analyses for RNA-sequencing and microarray studies. Nucleic Acids Research 43(7), e47.
A BibTeX entry for LaTeX users is
@Article{,
author = {Matthew E Ritchie and Belinda Phipson and Di Wu and Yifang Hu and Charity W Law and Wei Shi and Gordon K Smyth},
title = {{limma} powers differential expression analyses for {RNA}-sequencing and microarray studies},
journal = {Nucleic Acids Research},
year = {2015},
volume = {43},
number = {7},
pages = {e47},
doi = {10.1093/nar/gkv007},
}
citation("Biobase")
Orchestrating high-throughput genomic analysis with Bioconductor. W. Huber, V.J. Carey, R. Gentleman, ..., M. Morgan Nature Methods, 2015:12, 115.
A BibTeX entry for LaTeX users is
@Article{,
author = {W. Huber and V. J. Carey and R. Gentleman and S. Anders and M. Carlson and B. S. Carvalho and H. C. Bravo and S. Davis and L. Gatto and T. Girke and R. Gottardo and F. Hahne and K. D. Hansen and R. A. Irizarry and M. Lawrence and M. I. Love and J. MacDonald and V. Obenchain and A. K. {Ole's} and H. {Pag`es} and A. Reyes and P. Shannon and G. K. Smyth and D. Tenenbaum and L. Waldron and M. Morgan},
title = {{O}rchestrating high-throughput genomic analysis with {B}ioconductor},
journal = {Nature Methods},
year = {2015},
volume = {12},
number = {2},
pages = {115--121},
url = {http://www.nature.com/nmeth/journal/v12/n2/full/nmeth.3252.html},
}
citation("BiocManager")
To cite package ‘BiocManager’ in publications use:
Martin Morgan (2021). BiocManager: Access the Bioconductor Project Package Repository. R package version 1.30.16. https://CRAN.R-project.org/package=BiocManager
A BibTeX entry for LaTeX users is
@Manual{,
title = {BiocManager: Access the Bioconductor Project Package Repository},
author = {Martin Morgan},
year = {2021},
note = {R package version 1.30.16},
url = {https://CRAN.R-project.org/package=BiocManager},
}
citation("biomaRt")
To cite the biomaRt package in publications use:
Mapping identifiers for the integration of genomic datasets with the R/Bioconductor package biomaRt. Steffen Durinck, Paul T. Spellman, Ewan Birney and Wolfgang Huber, Nature Protocols 4, 1184-1191 (2009).
BioMart and Bioconductor: a powerful link between biological databases and microarray data analysis. Steffen Durinck, Yves Moreau, Arek Kasprzyk, Sean Davis, Bart De Moor, Alvis Brazma and Wolfgang Huber,
Bioinformatics 21, 3439-3440 (2005).
To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set 'options(citation.bibtex.max=999)'.
citation("magrittr")
To cite package ‘magrittr’ in publications use:
Stefan Milton Bache and Hadley Wickham (2022). magrittr: A Forward-Pipe Operator for R. https://magrittr.tidyverse.org, https://github.com/tidyverse/magrittr.
A BibTeX entry for LaTeX users is
@Manual{,
title = {magrittr: A Forward-Pipe Operator for R},
author = {Stefan Milton Bache and Hadley Wickham},
year = {2022},
note = {https://magrittr.tidyverse.org,
https://github.com/tidyverse/magrittr},
}
citation("GEOquery")
Please cite the following if utilizing the GEOquery software:
Davis, S. and Meltzer, P. S. GEOquery: a bridge between the Gene Expression Omnibus (GEO) and BioConductor. Bioinformatics, 2007, 14, 1846-1847
A BibTeX entry for LaTeX users is
@Article{,
author = {Sean Davis and Paul Meltzer},
title = {GEOquery: a bridge between the Gene Expression Omnibus (GEO) and BioConductor},
journal = {Bioinformatics},
year = {2007},
volume = {14},
pages = {1846--1847},
}
citation("RSQLite")
To cite package ‘RSQLite’ in publications use:
Kirill Müller, Hadley Wickham, David A. James and Seth Falcon (2022). RSQLite: SQLite Interface for R. https://rsqlite.r-dbi.org, https://github.com/r-dbi/RSQLite.
A BibTeX entry for LaTeX users is
@Manual{,
title = {RSQLite: SQLite Interface for R},
author = {Kirill Müller and Hadley Wickham and David A. James and Seth Falcon},
year = {2022},
note = {https://rsqlite.r-dbi.org, https://github.com/r-dbi/RSQLite},
}
citation("limma")
Please cite the paper below for the limma software itself. Please also try to cite the appropriate methodology articles that describe the statistical methods implemented in limma, depending on which limma functions you
are using. The methodology articles are listed in Section 2.1 of the limma User's Guide.
Ritchie, M.E., Phipson, B., Wu, D., Hu, Y., Law, C.W., Shi, W., and Smyth, G.K. (2015). limma powers differential expression analyses for RNA-sequencing and microarray studies. Nucleic Acids Research 43(7), e47.
A BibTeX entry for LaTeX users is
@Article{,
author = {Matthew E Ritchie and Belinda Phipson and Di Wu and Yifang Hu and Charity W Law and Wei Shi and Gordon K Smyth},
title = {{limma} powers differential expression analyses for {RNA}-sequencing and microarray studies},
journal = {Nucleic Acids Research},
year = {2015},
volume = {43},
number = {7},
pages = {e47},
doi = {10.1093/nar/gkv007},
}
citation("org.Hs.eg.db")
To cite package ‘org.Hs.eg.db’ in publications use:
Marc Carlson (2021). org.Hs.eg.db: Genome wide annotation for Human. R package version 3.14.0.
A BibTeX entry for LaTeX users is
@Manual{,
title = {org.Hs.eg.db: Genome wide annotation for Human},
author = {Marc Carlson},
year = {2021},
note = {R package version 3.14.0},
}
ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and may need manual editing, see ‘help("citation")’.
citation('umap')
To cite package ‘umap’ in publications use:
Tomasz Konopka (2022). umap: Uniform Manifold Approximation and Projection. R package version 0.2.8.0. https://github.com/tkonopka/umap
A BibTeX entry for LaTeX users is
@Manual{,
title = {umap: Uniform Manifold Approximation and Projection},
author = {Tomasz Konopka},
year = {2022},
note = {R package version 0.2.8.0},
url = {https://github.com/tkonopka/umap},
}
citation("vegan")
To cite package ‘vegan’ in publications use:
Jari Oksanen, F. Guillaume Blanchet, Michael Friendly, Roeland Kindt, Pierre Legendre, Dan McGlinn, Peter R. Minchin, R. B. O'Hara, Gavin L. Simpson, Peter Solymos, M. Henry H. Stevens, Eduard Szoecs and Helene Wagner
(2020). vegan: Community Ecology Package. https://cran.r-project.org, https://github.com/vegandevs/vegan.
A BibTeX entry for LaTeX users is
@Manual{,
title = {vegan: Community Ecology Package},
author = {Jari Oksanen and F. Guillaume Blanchet and Michael Friendly and Roeland Kindt and Pierre Legendre and Dan McGlinn and Peter R. Minchin and R. B. O'Hara and Gavin L. Simpson and Peter Solymos and M. Henry H. Stevens and Eduard Szoecs and Helene Wagner},
year = {2020},
note = {https://cran.r-project.org, https://github.com/vegandevs/vegan},
}
ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and may need manual editing, see ‘help("citation")’.
citation('gprofiler2')
To cite gprofiler2 in publications, please use:
Kolberg L, Raudvere U, Kuzmin I, Vilo J, Peterson H (2020). “gprofiler2- an R package for gene list functional enrichment analysis and namespace conversion toolset g:Profiler.” _F1000Research_, *9 (ELIXIR)*(709). R
package version 0.2.1.
A BibTeX entry for LaTeX users is
@Article{,
title = {gprofiler2-- an R package for gene list functional enrichment analysis and namespace conversion toolset g:Profiler},
journal = {F1000Research},
author = {Liis Kolberg and Uku Raudvere and Ivan Kuzmin and Jaak Vilo and Hedi Peterson},
volume = {9 (ELIXIR)},
number = {709},
year = {2020},
note = {R package version 0.2.1},
}
citation('ggrepel')
To cite package ‘ggrepel’ in publications use:
Kamil Slowikowski (2021). ggrepel: Automatically Position Non-Overlapping Text Labels with 'ggplot2'. R package version 0.9.1. https://github.com/slowkow/ggrepel
A BibTeX entry for LaTeX users is
@Manual{,
title = {ggrepel: Automatically Position Non-Overlapping Text Labels with
'ggplot2'},
author = {Kamil Slowikowski},
year = {2021},
note = {R package version 0.9.1},
url = {https://github.com/slowkow/ggrepel},
}
LS0tCnRpdGxlOiAiQTJfU2FiYmlyX0hvc3NhaW4iCnN1YnRpdGxlOiAiQkNCNDIwIC0gQ29tcHV0YXRpb25hbCBTeXN0ZW1zIEJpb2xvZ3k6IEFzc2lnbm1lbnQgMiAtIERpZmZlcmVudGlhbCBHZW5lIEV4cHJlc3Npb24gYW5kIFByZWxpbWluYXJ5IE9SQSIKYXV0aG9yOiAiU2FiYmlyIEhvc3NhaW4iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgaHRtbF9ub3RlYm9vazoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKCi0tLQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpzdXBwcmVzc1dhcm5pbmdzKAp7aWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJCaW9jTWFuYWdlciIsIHF1aWV0bHkgPSBUUlVFKSkKICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJHRU9tZXRhZGIiLCBxdWlldGx5ID0gVFJVRSkpCiAgICBCaW9jTWFuYWdlcjo6aW5zdGFsbCgiR0VPbWV0YWRiIikKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJsaW1tYSIsIHF1aWV0bHkgPSBUUlVFKSkKICAgIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJsaW1tYSIpCmlmICghcmVxdWlyZU5hbWVzcGFjZSgiQW5ub3RhdGlvbkRiaSIsIHF1aWV0bHkgPSBUUlVFKSkKICAgIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJBbm5vdGF0aW9uRGJpIikKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJvcmcuSHMuZWcuZGIiLCBxdWlldGx5ID0gVFJVRSkpCiAgICBCaW9jTWFuYWdlcjo6aW5zdGFsbCgib3JnLkhzLmVnLmRiIikKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJlZGdlUiIsIHF1aWV0bHkgPSBUUlVFKSkKICAgIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJlZGdlUiIpCmlmICghcmVxdWlyZU5hbWVzcGFjZSgicmVhZHhsIiwgcXVpZXRseSA9IFRSVUUpKQogICAgQmlvY01hbmFnZXI6Omluc3RhbGwoInJlYWR4bCIpCmlmICghcmVxdWlyZU5hbWVzcGFjZSgiUkNvbG9yQnJld2VyIiwgcXVpZXRseSA9IFRSVUUpKQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJ0aWR5dmVyc2UiLCBxdWlldGx5ID0gVFJVRSkpCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoImdncGxvdDIiLCBxdWlldGx5ID0gVFJVRSkpCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJkcGx5ciIsIHF1aWV0bHkgPSBUUlVFKSkKICAgIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJ2ZWdhbiIsIHF1aWV0bHkgPSBUUlVFKSkKICAgIGluc3RhbGwucGFja2FnZXMoInZlZ2FuIikKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJncHJvZmlsZXIyIiwgcXVpZXRseSA9IFRSVUUpKQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3Byb2ZpbGVyMiIpCmlmICghcmVxdWlyZU5hbWVzcGFjZSgiQ29tcGxleEhlYXRtYXAiLCBxdWlldGx5ID0gVFJVRSkpCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJDb21wbGV4SGVhdG1hcCIpfSkKIApzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQogIGxpYnJhcnkoZWRnZVIpCiAgbGlicmFyeShHRU9tZXRhZGIpCiAgbGlicmFyeShSQ29sb3JCcmV3ZXIpCiAgbGlicmFyeShnZ3Bsb3QyKQogIGxpYnJhcnkocmVhZHhsKQogIGxpYnJhcnkoZHBseXIpCiAgbGlicmFyeShBbm5vdGF0aW9uRGJpKQogIGxpYnJhcnkobGltbWEpCiAgbGlicmFyeShCaW9iYXNlKQogIGxpYnJhcnkoQmlvY01hbmFnZXIpCiAgbGlicmFyeShiaW9tYVJ0KQogIGxpYnJhcnkobWFncml0dHIpCiAgbGlicmFyeShHRU9xdWVyeSkKICBsaWJyYXJ5KFJTUUxpdGUpCiAgbGlicmFyeShsaW1tYSkKICBsaWJyYXJ5KG9yZy5Icy5lZy5kYikKICBsaWJyYXJ5KHVtYXApCiAgbGlicmFyeSh2ZWdhbikKICBsaWJyYXJ5KGdwcm9maWxlcjIpCiAgbGlicmFyeShnZ3JlcGVsKQp9KQpgYGAKIyBPdmVydmlldwoKVGhlIHB1cnBvc2Ugb2YgdGhpcyBhc3NpZ25tZW50IGlzIHRvIHRha2UgdGhlIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBkYXRhIHRoYXQgd2FzIGNyZWF0ZWQgaW4gQXNzaWdubWVudCAjMSBhbmQgdGhlbiByYW5rIGdlbmVzIGFjY29yZGluZyB0byBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbi4gV2l0aCB0aGF0IHJhbmtlZCBsaXN0IHBlcmZvcm0gdGhyZXNob2xkZWQgb3Zlci1yZXByZXNlbnRhdGlvbiBhbmFseXNpcyhPUkEpIHRvIGhpZ2hsaWdodCBkb21pbmFudCBnZW5lcy90aGVtZXMgaW4gdGhlIHRvcCBzZXQgb2YgZ2VuZXMuCgpUaGUgbmV4dCB0d28gc2VjdGlvbnMgd2lsbCBkZWFsIHdpdGggcHJvdmlkaW5nIGJhY2tncm91bmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFwZXIgYW5kIHByZXZpb3VzIGFzc2lnbm1lbnRzLiAKClRoZSBsaW5rIHRvIHRoZSBqb3VybmFsIGNhbiBiZSBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCwgb3IgYnkgY2xpY2tpbmcgdGhlIHJlbGF0ZWQgc3ViaGVhZGluZyBpbiB0aGUgdGFibGUgb2YgY29udGVudHMgYWJvdmUuIAoKIyMgQmFja2dyb3VuZCBpbmZvcm1hdGlvbiBoZXJlLCBwYXJhcGhhc2VkIGZyb20gdGhlIHBhcGVyLiAKVGhpcyB3YXMgYSByZWFsbHkgaW50ZXJlc3RpbmcgcGFwZXIsIGJ1dCBJIHdpbGwgc2F2ZSB0aGF0IGRpc2N1c3Npb24gZm9yIHRoZSBsYXRlciBwYXJ0IG9mIHRoaXMgYXNzaWdubWVudC4gQSBwcmlvciB0cmFuc2NyaXB0b21lIG1ldGEtYW5hbHlzaXMgZm91bmQgc2lnbmlmaWNhbnRseSBkZWNyZWFzZWQgbGV2ZWxzIG9mIGNvcnRpY290cm9waW4tcmVsZWFzaW5nIGhvcm1vbmUgKENSSCkgbVJOQSBpbiBjb3J0aWNvbGltYmljIGJyYWluIGFyZWFzIGluIE1ERCBwYXRpZW50cywgaW5kaWNhdGluZyB0aGF0IGNvcnRpY2FsIENSSC1leHByZXNzaW5nIChDUkgrKSBjZWxscyBhcmUgaW1wYWlyZWQgaW4gTURELiBBbHRob3VnaCByb2RlbnQgc3R1ZGllcyByZXZlYWwgdGhhdCBjb3J0aWNhbCBDUkggaXMgcHJlZG9taW5hbnRseSBleHByZXNzZWQgaW4gR0FCQWVyZ2ljIGludGVybmV1cm9ucywgbGl0dGxlIGlzIGtub3duIGFib3V0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgQ1JIKyBjZWxscyBpbiB0aGUgaHVtYW4gY2VyZWJyYWwgY29ydGV4IGFuZCB0aGVpciByZWxhdGlvbnNoaXAgdG8gTURELiBIdW1hbiB2b2x1bnRlZXJzIHdpdGhvdXQgYnJhaW4gaWxsbmVzc2VzIGhhZCB0aGVpciBzdWJnZW51YWwgYW50ZXJpb3IgY2luZ3VsYXRlIGNvcnRleCAoc2dBQ0MpIGlkZW50aWZpZWQgZm9yIENSSCBhbmQgbWFya2VycyBvZiBleGNpdGF0b3J5IChTTEMxN0E3KSwgaW5oaWJpdG9yeSAoR0FEMSksIGFuZCBvdGhlciBpbnRlcm5ldXJvbiBzdWJwb3B1bGF0aW9ucyB1c2luZyBmbHVvcmVzY2VudCBpbiBzaXR1IGh5YnJpZGl6YXRpb24gKEZJU0gpIChQVkFMQiwgU1NULCBWSVApLiBDaGFuZ2VzIGluIENSSCsgY2VsbCBkZW5zaXR5IGFuZCBjZWxsdWxhciBDUkggZXhwcmVzc2lvbiAobiA9IDYvZ3JvdXApIHdlcmUgaW52ZXN0aWdhdGVkIGluIE1ERCBwYXRpZW50cy4gUk5BLXNlcXVlbmNpbmcgd2FzIGRvbmUgb24gc2dBQ0MgQ1JIKyBpbnRlcm5ldXJvbnMgZnJvbSBjb21wYXJpc29uIGFuZCBNREQgcGFydGljaXBhbnRzIChuID0gNi9ncm91cCkgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55IHZhcmlhdGlvbnMgYmV0d2VlbiB0aGUgdHdvIGdyb3Vwcy4gSW4gbWljZSB3aXRoIFRya0IgZnVuY3Rpb24gc3VwcHJlc3NlZCwgdGhlIGVmZmVjdCBvZiBkZWNyZWFzZWQgQkRORiBvbiBDUkggZXhwcmVzc2lvbiB3YXMgaW52ZXN0aWdhdGVkLiBHQUJBZXJnaWMgY2VsbHMgbWFkZSB1cCA4MCBwZXJjZW50IG9mIENSSCsgY2VsbHMsIHdoZXJlYXMgZ2x1dGFtYXRlcmdpYyBjZWxscyBtYWRlIHVwIDE3LjUgcGVyY2VudC4gVklQICg1MiUpIGFuZCBTU1QgKDclKSwgYXMgd2VsbCBhcyBQVkFMQiwgd2VyZSBjby1leHByZXNzZWQgYnkgQ1JIKyBHQUJBZXJnaWMgaW50ZXJuZXVyb25zICg3IHBlcmNlbnQgKS4gTUREIHBhdGllbnRzIGhhZCBsb3dlciBDUkggbVJOQSBsZXZlbHMgaW4gR0FCQWVyZ2ljIGludGVybmV1cm9ucyB0aGFuIGNvbnRyb2wgcGFydGljaXBhbnRzLCBkZXNwaXRlIG5vIGRpZmZlcmVuY2VzIGluIGNlbGwgZGVuc2l0eS4gVGhlIHRyYW5zY3JpcHRvbWUgcHJvZmlsZSBvZiBDUkgrIGludGVybmV1cm9ucyBzdWdnZXN0cyBkZWNyZWFzZWQgZXhjaXRhYmlsaXR5IGFuZCBsZXNzIEdBQkEgcmVsZWFzZSBhbmQgcmV1cHRha2UuIEZ1cnRoZXIgcmVzZWFyY2ggcmV2ZWFsZWQgdGhhdCB0aGVzZSBtb2xlY3VsYXIgYWx0ZXJhdGlvbnMgYXJlIG5vdCBjYXVzZWQgYnkgYWx0ZXJlZCBnbHVjb2NvcnRpY29pZCBmZWVkYmFjaywgYnV0IHJhdGhlciBvY2N1ciBkb3duc3RyZWFtIG9mIGEgY29tbW9uIG5ldXJvdHJvcGhpYyBmdW5jdGlvbiBtb2R1bGF0b3IuCgpFc3NlbnRpYWxseSwgdGhlcmUgd2FzIGEgc3Ryb25nIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBnZW5lIGV4cHJlc3Npb24gb3IgbGFjayB0aGVyZW9mIGZvciBpbmRpdmlkdWFscyB3aG8gc3VmZmVyZWQgZnJvbSBNREQuIAoKSGVyZSBpcyBhIGRpcmVjdCBsaW5rIHRvIHRoZSBxdWVyeSBmb3IgdGhpcyBkYXRhc2V0LiAKKFtHU0UxOTM0MTddKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvZ2VvL3F1ZXJ5L2FjYy5jZ2k/YWNjPUdTRTE5MzQxNykpLgoKSGVyZSBpcyBhIGRpcmVjdCBsaW5rIHRvIHRoZSBwYXBlciB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YXNldCBhYm92ZS4gCihbUE1JRDogMzUyODAxNjRdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcHVibWVkLzM1MjgwMTY0KSkKKFtQTUNJRDogUE1DODkxMzg5OV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wbWMvYXJ0aWNsZXMvUE1DODkxMzg5OS8pKQoKIyMgSWRlYXMsIEludGVycHJldGF0aW9uLCBiYXNpYyBzdGF0aXN0aWNzIGFuZCBhbmFseXNpcyBmcm9tIEExCkluIEFzc2lnbm1lbnQgMSwgd2UgY3JlYXRlZCBsb2cgZGVuc2l0eSBncmFwaHMsIE1EUyBwbG90cywgTUEgcGxvdHMgYWZ0ZXIgd2UgY2hvc2UgYSBleHByZXNzaW9uIGRhdGFzZXQgZnJvbSBHRU8gZGF0YWJhc2Ugc28gdGhhdCB3ZSBtYXkgdXNlIHRoZW0gZm9yIGFuYWx5c2lzIGFuZCBwcm9jZXNzaW5nIGFzIG9uZSB3b3VsZCBkbyBpbiB0aGUgZmllbGQgb2YgYmlvaW5mb3JtYXRpY3MuIEFmdGVyIHNlbGVjdGluZyB0aGlzIGV4cHJlc3Npb24gc2V0LCB3ZSBhcmUgdG8gcmV0cmlldmUgaXQsIG1hcCBpdCwgbm9ybWFsaXplIGl0LCBhbmQgZmluYWxseSBpbnRlcnByZXQgaXQsIGJ5IHVzZSBvZiBncmFwaHMgYW5kIHBsb3RzIGFzIG1lbnRpb25lZCBlYXJsaWVyLiBUaGUgY29uY2x1c2lvbiB0aGF0IEkgY2FtZSB0byBpbiBBc3NpZ25tZW50IDEgd2FzIHRoYXQgdGhlcmUgd2FzIGluIGZhY3QgYSBzdHJvbmcgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGdlbmVzLCB0aGVpciBleHByZXNzaW9ucyBhbmQgdGhlIHJlc3VsdHMgdGhlIGF1dGhvcnMgb2YgdGhlIHBhcGVyIGhhZC4gXG5ld2xpbmUKClRoZSBkYXRhc2V0IChbR1NFMTkzNDE3XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L2dlby9xdWVyeS9hY2MuY2dpP2FjYz1HU0UxOTM0MTcpKSwgc3RhcnRlZCB3aXRoIDE5OTYxIGdlbmVzIGZvciBlYWNoIG9mIHRoZSAxMiBTYW1wbGVzOyBDUkgtSHUxMDAxIHNnQUNDX01ERCwJQ1JILUh1MTAzIHNnQUNDX2NvbnRyb2wsIENSSC1IdTEwNDcJc2dBQ0NfY29udHJvbCwgQ1JILUh1MTA4NglzZ0FDQ19jb250cm9sLCBDUkgtSHU1MTMgc2dBQ0NfTURELCBDUkgtSHU2MDAJc2dBQ0NfTURELCBDUkgtSHU2MTUgc2dBQ0NfY29udHJvbCwgQ1JILUh1Nzg5CXNnQUNDX2NvbnRyb2wsIENSSC1IdTgwOQlzZ0FDQ19NREQsIENSSC1IdTg1MiBzZ0FDQ19jb250cm9sLiBXaGVyZSBzZ0FDQ19jb250cm9sIGdyb3VwcyBhcmUgaW5kaXZpZHVhbHMgaGF2ZSB1bmltcGFpcmVkIENSSCsgY2VsbHMgd2hlcmVhcyBNREQgaW5kaXZpZHVhbHMgaGF2ZSBpbXBhaXJlZCBDUkgrIGNlbGxzLiBBZnRlciBjbGVhbmluZyBhbmQgbm9ybWFsaXppbmcgdGhlIGRhdGEsIGJ5IHJlbW92aW5nIGdlbmVjb3VudHMgdGhhdCB3ZXJlIGZld2VyIHRoYW4gNiBkdWUgdG8gZWFjaCBzYW1wbGUgc2l6ZSBoYXZpbmcgNiBwYXJ0aWNwYW50cyBlYWNoLCB0aGUgZGF0YXNldCBoYWQgdGhlIGVuc2VtYmxlX2dlbmVfaWRzIG1hcHBlZCB0byBIR05DIHN5bWJvbHMgZm9yIGVhc3kgZ2VuZSBpZGVudGlmaWNhdGlvbiBhZnRlcndoaWNoIHRoZSBnZW5lY291bnRzIHdlcmUgbm9ybWFsaXplZCBhbmQgcGxvdHRlZC4gQXNzaWdubWVudCAxIHJlbW92ZWQgMjMuMTElIG9mIHRoZSBvcmlnaW5hbCBnZW5lcywgd2hpY2ggbGVmdCBtZSB3aXRoIGEgZmluYWwgZ2VuZSBjb3VudCBvZiAxNTM0OS4gV2hpY2ggaXMgc2xpZ2h0bHkgbG93ZXIgdGhhbiB0aGUgcGFwZXIncyBnZW5lY291bnQgYnV0IHRoYXQgd2FzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgYXV0aG9ycyB1c2luZyBkaWZmZXJlbnQgY2xlYW5pbmcgYW5kIGxpbWl0YXRpb24gbWV0aG9kcy4gV2hpY2ggd2FzIG15IGZpbmFsIGRhdGEgZnJhbWUgb2JqZWN0ICwgJ0ZpbmFsR2VuZUZpbHRlcicuIFdoYXQgSSBmb3VuZCBpbiB0aGUgbm9ybWFsaXplZCBkYXRhc2V0IGFmdGVyIHBsb3R0aW5nIHdhcyB0aGF0IHRoZXJlIHdhcyBhIGNhdXNhbCByZWxhdGlvbnNoaXAsIHRoZSBzYW1lIGNvbmNsdXNpb25zIGFzIHRoZSBhdXRob3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcGxlYXNlIHNlZSB0aGUgRmlndXJlIDEsIGFuIE1EUyBiZWxvdyBhbmQgRmlndXJlIDIsIHRoZSBkZW5zaXR5IGRpc3RyaWJ1dGlvbiBjdXJ2ZSwgYm90aCB1c2luZyB0aGUgbm9ybWFsaXplZCBkYXRhc2V0IGFzIG1lbnRpb25lZCBiZWZvcmUuIAoKIyBTZXR1cApTZXQgdXAgYWxsIHRoZSBkYXRhIHdlIHVzZWQgZnJvbSBBc3NpZ25tZW50IDEuIFJlYXNvbmluZyBmb3IgZG9pbmcgaXQgdGhpcyB3YXkuLi5pcyBiZWNhdXNlIHRoZXJlIGNvdWxkIGhhdmUgYmVlbiBlZGl0cyB0byB0aGUgb3JpZ2luYWwgZGF0YXNldCB0aGF0IGlzIGJlaW5nIHVzZWQuIEFsc28sIHVzaW5nIEFzc2lnbm1lbnQgYXMgYSBjaGlsZCBub2RlIGZvciB0aGlzIEFzc2lnbm1lbnQgaXMgYXNzdW1pbWluZyB0aGF0IGV2ZXJ5IHRoYXQgd2FzIGRvbmUsIGFuZCB0aGUgbWFubmVyIGl0IHdhcyBkb25lIGluIEFzc2lnbm1lbnQgMSB3YXMgY29ycmVjdC4gSW4gc29tZSBjYXNlcyB0aGlzIGlzIG5vdCBjb3JyZWN0IGFzIG15IE1EUyBwbG90LCBkaWQgbm90IGV4cHJlc3MgdGhlIGZ1bGwgbnVtZXJpY2FsIHJhbmdlIHRoYXQgaXQgY291bGQgaGF2ZS4gSSBoYXZlIGFkZHJlc3NlZCB0aGF0IGJlbG93IGluIHRoaXMgYXNzaWdubWVudCwgYnkgcHJvcGVybHkgc2VsZWN0aW5nIHRoZSBkYXRhdHlwZSBhbmQgYWRkcmVzc2luZyBzb21lIG1pbm9yIGZvcm1hdHRpbmcgaXNzdWVzIGluIHRoZSBkYXRhIGZyb20gQXNzaWdubWVudCAxIGFzIHdlbGwuIAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmlmICghZmlsZS5leGlzdHMoIkdTRTE5MzQxNy5yZHMiKSkgewogIEdTRTE5MzQxNyA8LSBnZXRHRU8oIkdTRTE5MzQxNyIsIEdTRU1hdHJpeCA9VFJVRSwgZ2V0R1BMPSBGQUxTRSkKICBpZiAobGVuZ3RoKEdTRTE5MzQxNykgPiAxKSBpZHggPC0gZ3JlcCgiR1BMMTY3OTEiLCBhdHRyKEdTRTE5MzQxNywgIm5hbWVzIikpIGVsc2UgaWR4IDwtIDEKICBHU0UxOTM0MTdzIDwtIEdTRTE5MzQxN1tbaWR4XV0KICBzYXZlUkRTKEdTRTE5MzQxNywgIkdTRTE5MzQxNy5yZHMiKQp9IGVsc2UgewogIEdTRTE5MzQxNyA8LSByZWFkUkRTKCJHU0UxOTM0MTcucmRzIikgCn0KCmlmICghZGlyLmV4aXN0cygnR1NFMTkzNDE3JykpewogIGdzZWZpbGVzID0gZ2V0R0VPU3VwcEZpbGVzKCdHU0UxOTM0MTcnKQogIChmbmFtZXMgPC0gcm93bmFtZXMoZ3NlZmlsZXMpKQp9IGVsc2UgewogIGdzZWZpbGVzID0gZ2V0R0VPU3VwcEZpbGVzKCdHU0UxOTM0MTcnLCBmZXRjaF9maWxlcyA9IEZBTFNFKQogIGZuYW1lcyA8LSBwYXN0ZShnZXR3ZCgpLCAnR1NFMTkzNDE3JywgZ3NlZmlsZXMkZm5hbWUsIHNlcCA9ICIvIikKfQoKZ3NlIDwtIHN1cHByZXNzTWVzc2FnZXMoZ2V0R0VPKCJHU0UxOTM0MTciLCBHU0VNYXRyaXggPSBGQUxTRSkpCm1kZEluTWUgPSByZWFkLmNzdihmbmFtZXNbMV0saGVhZGVyPVRSVUUsIGNoZWNrLm5hbWVzID0gRkFMU0UpCmNvbG5hbWVzKG1kZEluTWUpWzFdIDwtICJFbnRyZXpJRCIKaW52aXNpYmxlKG5hLm9taXQobWRkSW5NZSkpCmZpbHRNZGRJbk1lIDwtIChtZGRJbk1lW3Jvd1N1bXMobWRkSW5NZSA+IDEpID49IDYsIF0pCnNhdmVSRFMoZmlsdE1kZEluTWUsICJHU0UxOTM0MTdfZmlsdGVyZWRfQ1BNLnJkcyIpCgppZiAoIWZpbGUuZXhpc3RzKCJHU0UxOTM0MTdfbm9ybWFsaXplZF9kYXRhc3RydWN0LnJkcyIpKXsKICBpZighZXhpc3RzKCdlbnNlbWJsJykpewogICAgZW5zZW1ibCA8LSB1c2VNYXJ0KGJpb21hcnQgPSAiZW5zZW1ibCIsIGRhdGFzZXQ9ImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIpCiAgfQogIGlmKCFleGlzdHMoJ2dlbmVJRHMnKSl7CiAgICBnZW5lSURzIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdlbnNlbWJsX2dlbmVfaWQnLCAnaGduY19zeW1ib2wnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gJ2Vuc2VtYmxfZ2VuZV9pZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gZmlsdE1kZEluTWUkRW50cmV6SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFydCA9IGVuc2VtYmwpCiAgfQogIAogICMgdW5tYXBwZWRzZWdzIGdlbmVzCiAgdW5tYXBwZWRzZWdzTnVtcyA9IG5yb3coZmlsdE1kZEluTWUpIC0gbnJvdyhnZW5lSURzKQogICNUaGUgdW5tYXBwZWQgc2VnbWVudHMgYW5kIHBvcnRpb25zIHdpbGwgYmUgcmVtb3ZlZC4gCiAgdW5tYXBwZWRzZWdzIDwtIGRwbHlyOjphbnRpX2pvaW4oZmlsdE1kZEluTWVbMV0sIGdlbmVJRHNbMV0sIGJ5ID0gYygiRW50cmV6SUQiID0gImVuc2VtYmxfZ2VuZV9pZCIpKQogICNSZW1vdmUgc29tZSByZXBpdGlvbnMKICBGaW5hbEdlbmVGaWx0ZXIgPC0gZHBseXI6OmlubmVyX2pvaW4oZ2VuZUlEcywgZmlsdE1kZEluTWUsIGJ5ID0gYygiZW5zZW1ibF9nZW5lX2lkIiA9ICJFbnRyZXpJRCIpKQogIHRlbXBSZXBlYXRzIDwtIGRhdGEuZnJhbWUodGFibGUoZ2VuZUlEcyRlbnNlbWJsX2dlbmVfaWQpKQogICNBbmQgdGhlbiBhZ2Fpbi4KICBGaW5hbEdlbmVGaWx0ZXIgPC0gRmluYWxHZW5lRmlsdGVyWyEoRmluYWxHZW5lRmlsdGVyJGhnbmNfc3ltYm9sPT0iU1RSQTZMUCIgfCBGaW5hbEdlbmVGaWx0ZXIkaGduY19zeW1ib2w9PSJMSU5DMDA4NTYiKSxdCiAgI0FuZCBhZ2Fpbi4gVGhlIGFpbSBpcyB0byByZW1vdmUgYW55IG9mIHRoZSBoZ25jIHN5bWJvbHMgdGhhdCBtYXBwZWQgdG8gbW9yZSB0aGFuIG9uZSBFbnNlbWJsZSBJRHMuIEVzc2VudGlhbGx5IHRoZSBFbnNlbWJsZSBJRHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc29tZSBzb3J0IG9mIGZ1bmN0aW9uLiBGb3IgZXZlcnkgMXgsIHRoZXJlIGlzIGV4YWN0bHkgMXkgdG8gcGFpciB3aXRoIGl0LiBMb2NrIGFuZCAgICAga2V5IHNvIHRvIHNwZWFrLgogIEZpbmFsR2VuZUZpbHRlciA8LSBGaW5hbEdlbmVGaWx0ZXJbIShGaW5hbEdlbmVGaWx0ZXIkaGduY19zeW1ib2w9PSJQT0xSMkozIiB8IEZpbmFsR2VuZUZpbHRlciRoZ25jX3N5bWJvbD09IlRCQ0UiKSxdCiAgZ29vZEhHTkNib3kgPC0gZGF0YS5mcmFtZSh0YWJsZShnZW5lSURzJGhnbmNfc3ltYm9sKSkKICBGaW5hbEdlbmVGaWx0ZXIgPC0gRmluYWxHZW5lRmlsdGVyWyEoRmluYWxHZW5lRmlsdGVyJGhnbmNfc3ltYm9sID09IiIpLCBdCiAga2VlcCA9IHJvd1N1bXMoRmluYWxHZW5lRmlsdGVyWzI6MTNdID4xKSA+PSA2CiAgRmluYWxHZW5lRmlsdGVyIDwtIEZpbmFsR2VuZUZpbHRlcltrZWVwLF0KICBzYXZlUkRTKEZpbmFsR2VuZUZpbHRlciwgIkdTRTE5MzQxN19maWx0ZXJlZF9zeW1ib2xzLnJkcyIpCiAgCiAgI0ZpeGVzIGFuZCBwcm9wZXJseSBmb3JtYXRzIHRoZSBjb2x1bW4gbmFtZXMgb2YgdGhlIGRhdGFmcmFtZS4gCiAgdGVzdEZpbmFsR2VuZUZpbHRlciA8LSBGaW5hbEdlbmVGaWx0ZXIKICBmb3IgKGkgaW4gMzpsZW5ndGgoY29sbmFtZXMoRmluYWxHZW5lRmlsdGVyKSkpIHsKICAgIHRlc3RuYW1lcyA8LSBzdHJzcGxpdCgoY29sbmFtZXMoRmluYWxHZW5lRmlsdGVyKVtpXSksICIuYmFtIikKICAgIGNvbG5hbWVzKHRlc3RGaW5hbEdlbmVGaWx0ZXIpW2ldIDwtIHRlc3RuYW1lcwogIH0KICBzYXZlUkRTKHRlc3RGaW5hbEdlbmVGaWx0ZXIsICJHU0UxOTM0MTdfZmluYWxmaWx0ZXJlZF9zeW1ib2xzLnJkcyIpCgogICNOb3JtYWxpemVkIGNvdW50cyBhbmQgdmFsdWVzLgogIGQgPC0gZWRnZVI6OkRHRUxpc3QodGVzdEZpbmFsR2VuZUZpbHRlclszOjE0XSkKICBkIDwtIGVkZ2VSOjpjYWxjTm9ybUZhY3RvcnMoZCkKICBub3JtYWxpemVkX2NvdW50c19wbWlsIDwtIGVkZ2VSOjpjcG0oZCkKICBzYXZlUkRTKG5vcm1hbGl6ZWRfY291bnRzX3BtaWwsICJHU0UxOTM0MTdfbm9ybWFsaXplZF9DUE0ucmRzIikKICBub3JtYWxpemVkX2RhdGFzdHJ1Y3QgPC0gY2JpbmQodGVzdEZpbmFsR2VuZUZpbHRlclsxOjJdLCBub3JtYWxpemVkX2NvdW50c19wbWlsKSAKICBzYXZlUkRTKG5vcm1hbGl6ZWRfZGF0YXN0cnVjdCwgIkdTRTE5MzQxN19ub3JtYWxpemVkX2RhdGFzdHJ1Y3QucmRzIikKfSBlbHNlIHsKICAKICBmaWx0TWRkSW5NZSA8LSByZWFkUkRTKCJHU0UxOTM0MTdfZmlsdGVyZWRfQ1BNLnJkcyIpCiAgRmluYWxHZW5lRmlsdGVyIDwtIHJlYWRSRFMoIkdTRTE5MzQxN19maWx0ZXJlZF9zeW1ib2xzLnJkcyIpCiAgdGVzdEZpbmFsR2VuZUZpbHRlciA8LSByZWFkUkRTKCJHU0UxOTM0MTdfZmluYWxmaWx0ZXJlZF9zeW1ib2xzLnJkcyIpCiAgbm9ybWFsaXplZF9jb3VudHNfcG1pbCA8LSByZWFkUkRTKCJHU0UxOTM0MTdfbm9ybWFsaXplZF9DUE0ucmRzIikKICBub3JtYWxpemVkX2RhdGFzdHJ1Y3QgPC0gcmVhZFJEUygiR1NFMTkzNDE3X25vcm1hbGl6ZWRfZGF0YXN0cnVjdC5yZHMiKQp9CmBgYApUaGlzIHNlY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRvd25sb2FkaW5nIHRoZSBkYXRhc2V0LCBjbGVhbmluZyB0aGUgaW1wb3J0ZWQgZGF0YXNldCwgYXBwbHlpbmcgbm9ybWFsaXphdGlvbiBhbmQgc2F2aW5nIGl0IGFsb25nIGFueSBtaWxlc3RvbmUgc3RlcHMuIE5vdCBhbGwgb2YgdGhlc2UgYXJlIHJlcXVpcmVkLCBidXQgSSBkaWQgdGhpcyBhcyBhIGZvcm0gb2YgcmVkdW5kYW5jeSBpbiB0aGUgZXZlbnQgdGhhdCBzb21lIGRhdGEgYWNjZXNzaW9uIHByb2JsZW1zIG9jY3VyLCBmb3IgaW5zdGFuY2UgdGhlIGVuc2VtYmxlIHNpdGUgYW5kIGl0cyB2YXJpb3MgbWlycm9ycyBub3QgYmVpbmcgYWNjZXNzaWJsZS4gQ2F1c2luZyBhIHNpZ25pZmljYW50IGRlbGF5IGFuZCBmcnVzdHJhdGlvbiBpbiBjb21waWxhdGlvbiBhcyB3ZWxsIGFzIGR1cmluZyBhbmFseXNpcy4gVGhpcyB3YXkgaGF2aW5nIGFsbCB0aGUgcmVxdWlyZSBmaWxlcyBiZWluZyBkb3dubG9hZGVkIGFuZCBzYXZlZCBvbmNlIG1ha2VzIGZvciBzaW1wbGUgYW5kIHF1aWNrIGFjY2Vzc2lvbiBhbmQgYW5hbHlzaXMuIAoKIyMjIEVycm9yIENoZWNrCmBgYHtSfQojY2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxlcyBhcmUgYWN0dWFsbHkgdGhlcmUuIElmIG5vdCBkZWxldGUgZXZlcnl0aGluZyBhbmQgdHJ5IGFnYWluLgppZiAoIWZpbGUuZXhpc3RzKCJHU0UxOTM0MTdfbm9ybWFsaXplZF9kYXRhc3RydWN0LnJkcyIpKSB7CiAgcHJpbnQoIlRoZSByZXF1aXJlZCBmaWxlcyBkbyBub3QgZXhpc3QsIG9uZSBtb21lbnQgd2hpbGUgYWxsIHRoZSBkYXRhIGlzIGJlaW5nIGNvbmZpZ3VyZWQuIAogICAgICAgIElmIHRoZSBub3RlYm9vayBzdG9wcyBydW5uaW5nLCB5b3UgbWlnaHQgbmVlZCB0byBkZWxldGUgYWxsIHRoZSAKICAgICAgICBhc3NvY2lhdGVkIGZpbGVzIHdpdGggdGhpcyBub3RlYm9vayBhbmQgcnVuIGl0IGZyb20gdGhlIGJlZ2luaW5nLiIpCn0gZWxzZSB7CnByaW50KCJUaGUgcmVxdWlyZWQgZmlsZXMgZXhpc3QsIHlvdSBtYXkgY29udGludWUgdG8gcnVuIHRoaXMgUi1Ob3RlYm9vayIpCn0KYGBgCkp1c3QgYSBxdWljayBhc2lkZSBhbmQgc2lkZW5vdGUgaGVyZSwgZm9yIG1lIHRoZSBvdXRwdXQgd2lsbCBhbHdheXMgcHJpbnQgYXMgIlRoZSByZXF1aXJlZCBmaWxlcyBleGlzdCwgeW91IG1heSBjb250aW51ZSB0byBydW4gdGhpcyBSLU5vdGVib29rIiwgYmVjYXVzZSBJIGhhdmUgYWxsIHRoZSByZXF1aXJlZCBSRFMgY29uZmlndXJlZCBhbmQgZG93bmxvYWRlZC4gSG93ZXZlciwgZm9yIHRoZSBmaXJzdCBydW4gaXQgd2lsbCBwcmludCB0aGUgZXJyb3IgdGhhdCB0aGUgZmlsZXMgZG9uJ3QgZXhpc3QsIGluIHdoaWNoIGNhc2UgeW91IHdpbGwgaGF2ZSB0byBkZWxldGUgZXZlcnl0aGluZyBhbmQgc3RhcnQgb3ZlciBhcyB0aGUgcHJpbnQgc3RhdGVtZW50IHN1Z2dlc3RzLiAKCgojIERpZmZlcmVudGlhbCBHZW5lIEV4cHJlc3Npb24KCiMjIyBDb25zdHJ1Y3Rpb24gb2YgdGhlIERlc2lnbiBNYXRyaXgKYGBge1J9CnNhbXBsZXMgPC0gZGF0YS5mcmFtZSgKICBsYXBwbHkoY29sbmFtZXModGVzdEZpbmFsR2VuZUZpbHRlciksIEZVTj1mdW5jdGlvbih4KXsKICAgIHVubGlzdChzdHJzcGxpdCh4LCBzcGxpdCA9IEZBTFNFKSlbYygyLDMpXQogIH0KKSkKY29sbmFtZXMoc2FtcGxlcykgPC0gKGNvbG5hbWVzKHRlc3RGaW5hbEdlbmVGaWx0ZXIpWzM6MTRdKQojcmVtb3ZlcyB0aGUgZW1wdHkgY29sdW1uCnNhbXBsZXMgPC0gc3Vic2V0KHNhbXBsZXMsIHNlbGVjdCA9IC1jKDEzLCAxNCkpCnJvd25hbWVzKHNhbXBsZXMpIDwtIGMoInNhbXBsZV9leHByZXNzaW9uIiwgInNhbXBsZV9ncm91cCIpCnNhbXBsZXNbaXMubmEoc2FtcGxlcyldIDwtIDAKI2ZpbGwgaW4gdGhlIHNhbXBsZSBleHByZXNzaW9uIHR5cGUsIGlmIHRoZXkgYXJlIHNnQUNDIG9yIE1ERApzYW1wbGVzWzEsXSA8LSBjKCJzZ0FDQ19NREQiLCAic2dBQ0NfY29udHJvbCIsICJzZ0FDQ19jb250cm9sIiwJInNnQUNDX2NvbnRyb2wiLCAic2dBQ0NfTUREIiwJInNnQUNDX01ERCIsCSJzZ0FDQ19jb250cm9sIiwgInNnQUNDX2NvbnRyb2wiLCAic2dBQ0NfTUREIiwgInNnQUNDX2NvbnRyb2wiLAkic2dBQ0NfTUREIiwJInNnQUNDX01ERCIpCiNmaWxsIGluIHRoZSBzYW1wbGVfY2VsbCB0eXBlLCBpZiB0aGV5IGFyZSBhIGNvbnRyb2wgb3Igbm90LiAKc2FtcGxlc1syLF0gPC0gYygiTUREIiwiY29udHJvbCIsImNvbnRyb2wiLCJjb250cm9sIiwiTUREIiwiTUREIiwiY29udHJvbCIsImNvbnRyb2wiLCJNREQiLCJjb250cm9sIiwiTUREIiwiTUREIikKc2FtcGxlc01hdCA8LSBhcy5tYXRyaXgoc2FtcGxlcykKZ2VuZVN5bUlEIDwtIHRlc3RGaW5hbEdlbmVGaWx0ZXJbMToyXQpleHBEZXNpZ24gPC0gdGVzdEZpbmFsR2VuZUZpbHRlcgojIGNyZWF0ZSBncm91cHMgbWF0cml4OgpleHBHcm91cHMgPC0gYXMuZGF0YS5mcmFtZShjYmluZChyZXNwb25zZSA9IGV4cERlc2lnbiRoZWFkZXIpKQojIFNvbWUgZXhwZXJpbWVudGFsIGRlc2lnbiBpbmZvcm1hdGlvbiB3YXMgaW5jb3JyZWN0bHkgZW50ZXJlZCBpbiB0aGUgZG93bmxvYWRlZCBtZXRhZGF0YSBmaWxlLCBzbyB0aGlzIGluZm9ybWF0aW9uIHdhcyBtYW51YWxseSBlbnRlcmVkIGJhc2VkIG9uIHBhcGVyIGZpZ3VyZXM6CmV4cEdyb3VwcyA8LSBhcy5kYXRhLmZyYW1lKHJiaW5kKGV4cEdyb3Vwcywgc2FtcGxlcykpCmRlc2lnbmVkZCA8LSBkYXRhLmZyYW1lKGxhcHBseShjb2xuYW1lcyhub3JtYWxpemVkX2NvdW50c19wbWlsKSwgZnVuY3Rpb24oeCkgewogIGdzdWIoIlxcZCIsICIiLCB1bmxpc3Qoc3Ryc3BsaXQoeCwgIl8iKSkpCn0pKQpyb3duYW1lcyhkZXNpZ25lZGQpIDwtIHJvd25hbWVzKHNhbXBsZXNbMSxdKQpyb3duYW1lcyhkZXNpZ25lZGQpIDwtIHJvd25hbWVzKHNhbXBsZXNbMixdKQpjb2xuYW1lcyhkZXNpZ25lZGQpIDwtIGNvbG5hbWVzKG5vcm1hbGl6ZWRfY291bnRzX3BtaWwpCmV4cERlc2lnbiA8LSB0ZXN0RmluYWxHZW5lRmlsdGVyCmV4cEdyb3VwcyA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHJlc3BvbnNlID0gZXhwRGVzaWduJGhlYWRlcikpCmV4cEdyb3VwcyA8LSBhcy5kYXRhLmZyYW1lKHJiaW5kKGV4cEdyb3Vwcywgc2FtcGxlcykpCmRlc2lnbmVkZCA8LWV4cEdyb3VwcwpkZXNpZ24yIDwtIGRhdGEuZnJhbWUodChkZXNpZ25lZGQpKQprbml0cjo6a2FibGUoZGVzaWduMiwgdHlwZT0iaHRtbCIpCmBgYApUYWJsZSAxLiBTaG93cyB0aGUgZGVzaWduIG1hdHJpeCBmb3IgdGhlIHNhbXBsZXMsIHN0YXRpbmcgdGhlIHNhbXBsZSdzIGV4cHJlc3Npb24gdHlwZSBhbmQgaXRzIGdyb3VwaW5nLiBUaGUgY29udHJvbHMgYXJlIGNvbnRyb2wgaW5kaXZpZHVhbHMgd2hvIGRvIG5vdCBoYXZlIE1ham9yIERlcHJlc3NpdmUgRGlzb3JkZXIgKE1ERCksIHdoaWxlIHRob3NlIGxhYmVsbGVkIHdpdGggTUREIGhhdmUgTURELiAKCiMjIyBDb3JyZWN0ZWQgTURTIHBsb3QKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc25hbWVzIDwtIGNvbG5hbWVzKHRlc3RGaW5hbEdlbmVGaWx0ZXIpWzM6MTRdCmQgPC0gdGVzdEZpbmFsR2VuZUZpbHRlclszOjE0XQpncm91cHNzIDwtIGludGVyYWN0aW9uKHNuYW1lcywgc2FtcGxlc01hdFsic2FtcGxlX2dyb3VwIiwgXSkKCnBsb3RNRFMoZCwgY29sPWFzLm51bWVyaWMoZ3JvdXBzcyksIG1haW49Ik1EUyBwbG90IG9mIE5vcm0uIFJOQVNlcSBTYW1wbGVzIGZvciBHU0UxOTM0MTciKQpgYGAKCgpcbmV3bGluZSBGaWd1cmUgMS4gQW4gTURTIHBsb3QsIGkuZS4gbXVsdGlkaW1lbnNpb25hbCBzY2FsaW5nIHBvaW50cywgd2hpY2ggaGF2ZSBhbHJlYWR5IGJlZW4gYWNjb3VudGVkIGZvciB3aXRoIHRoZSBjb3JyZWN0IGxvZyBiYXNlIGR1ZSB0byB0aGUgImVkZ2UiIGZpeGluZywgYXJlIGEgd2F5IG9mIHNob3dpbmcgaG93IHRoZSBOUiBhbmQgUiBncm91cHMgb2YgYW55IGV4cGVyaW1lbnQgaW50ZXJhY3Qgd2l0aCBvbmUgYW5vdGhlciwgYXMgd2VsbCBhcyB3aXRoIG90aGVyIHNhbXBsZXMgZnJvbSB0aGUgc2FtZSBvcmdhbmlzbSwgZGlmZmVyZW50IG9yZ2FuaXNtcywgZGlmZmVyZW50IGFnZXMsIGFuZCBzbyBvbi4gVGhlcmUgaXMgb3ZlciBhIGhhbGYtZm9sZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMsIHRoZSBmaXJzdCBiZWluZyB0aGUgY29udHJvbCBncm91cCBmb3IgdGhpcyBzdHVkeSwgdGhvc2Ugd2hvIGFyZSBub3QgYWZmZWN0ZWQgYnkgTWFqb3IgRGVwcmVzc2l2ZSBEaXNvcmRlciAoTUREKSwgYW5kIHRoZSBzZWNvbmQgYmVpbmcgdGhvc2Ugd2hvIGFyZSBhZmZlY3RlZCBieSBNREQuIENSSCsgY2VsbHMgaW4gaHVtYW4gc2dBQ0MgYXJlIGEgZGl2ZXJzZSBwb3B1bGF0aW9uIG9mIEdBQkFlcmdpYyBpbnRlcm5ldXJvbnMsIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGV5IHByZWRvbWluYW50bHkgY28tZXhwcmVzcyBWSVAuIE91ciBmaW5kaW5ncyBzdWdnZXN0IHRoYXQgTUREIGlzIGFzc29jaWF0ZWQgd2l0aCBkZWNyZWFzZWQgaW5oaWJpdG9yeSBmdW5jdGlvbiBpbmRpY2F0b3JzIGluIHNnQUNDIENSSCsgaW50ZXJuZXVyb25zLCBhbmQgdGhleSBhZGQgdG8gdGhlIGdyb3dpbmcgYm9keSBvZiBldmlkZW5jZSB0aGF0IE1ERCBjYXVzZXMgY2hhbmdlcyBpbiBHQUJBZXJnaWMgZnVuY3Rpb24gaW4gdGhlIGNvcnRleC4gV2UgY2FuIHNlZSBmcm9tIHRoZSByZXN1bHRzIHRoYXQgdGhlcmUgaXMgYSBsb3Qgb2YgdmFyaWF0aW9uIGJldHdlZW4gY29udHJvbHMgYW5kIG5vbi1jb250cm9scywgYnV0IHRob3NlIHdobyBoYXZlIE1ERCBvciBkb24ndCBoYXZlIE1ERCB0ZW5kIHRvIGNsdXN0ZXIgYXJvdW5kIHRoZSBzYW1lIGFyZWEgb2YgdGhlIHBsb3QuIFRoaXMgZG9lcyBpbXBseSB0aGF0IHRoZXJlIGFyZSBnZW5lcyByZXNwb25zaWJsZSBmb3IgdGhlIHJlc3BvbnNlcyBvYnNlcnZlZCBieSBpbmRpdmlkdWFscyBhbmQgcmVzZWFyY2hlcnMuIE9uZSB0aGluZyB0aGF0IHdvdWxkIGJlIGdyZWF0IHRvIHNlZSBpbiBhIHBsb3QgbGlrZSB0aGlzIGlzIG9idmlvdXNseSBhIGxvdCBtb3JlIHNhbXBsZXMsIGFzIDYgc2FtcGxlcyBwZXIgZ3JvdXAgc2VlbXMgaW5zdWZmaWNpZW50LCBhcyB0aGUgcmVzZWFyY2hlcnMgcG9pbnRlZCBvdXQgaW4gdGhlaXIgcGFwZXIuCgoKIyMjIERlbnNpdHkgQ3VydmUgZm9yIE5vcm1hbGl6ZWQgRGlzdHJpYnV0aW9uIFZhbHVlcyAKYGBge1J9CmN0c0RlbmN0IDwtIGFwcGx5KGxvZzIoZWRnZVI6OmNwbShub3JtYWxpemVkX2RhdGFzdHJ1Y3RbLDM6MTRdKSksIDIsIGRlbnNpdHkpCmRhdGFwbG90MiA8LSBjKGNvbG5hbWVzKHNhbXBsZXMpKQoKeGxpbSA8LSAwOyB5bGltIDwtIDAKZm9yIChpIGluIDE6bGVuZ3RoKGN0c0RlbmN0KSkgewogIHhsaW0gPC0gcmFuZ2UoYyh4bGltLCBjdHNEZW5jdFtbaV1dJHgpKTsKICB5bGltIDwtIHJhbmdlKGMoeWxpbSwgY3RzRGVuY3RbW2ldXSR5KSkKfQpjb2xzIDwtIHJhaW5ib3cobGVuZ3RoKGN0c0RlbmN0KSkKbHR5cyA8LSByZXAoMSwgbGVuZ3RoKGN0c0RlbmN0KSkKCnBsb3QoY3RzRGVuY3RbWzFdXSwgeGxpbSA9IHhsaW0sIHlsaW0gPSB5bGltLCB0eXBlID0gIm4iLCB5bGFiID0gIlNtb290aGluZyBkZW5zaXR5IG9mIGxvZzItQ1BNIiwgbWFpbiA9ICJOb3JtYWxpemVkIERpc3RyaWJ1dGlvbiBWYWx1ZXMgZm9yIEdTRTE5MzQxNyIsIGNleC5sYWIgPSAwLjg1KQpmb3IgKGkgaW4gMTpsZW5ndGgoY3RzRGVuY3QpKQogIGxpbmVzKGN0c0RlbmN0W1tpXV0sIGNvbCA9IGNvbHNbaV0sIGx0eSA9IGx0eXNbaV0pCgpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gZGF0YXBsb3QyLCBjb2w9Y29scywgbHR5PWx0eXMsIGNleD0wLjc1LCBib3JkZXI9ImJsdWUiLCB0ZXh0LmNvbCA9ICJncmVlbjQiLCBtZXJnZSA9IFRSVUUsIGJnID0gImdyYXk5MCIpCiNSZW1lbWJlciB0byBhZGQgaW4gdGhlIGZpZ3VyZSBuYW1lLCBudW1iZXIgYW5kIGRlc2NyaXB0aW9uLiAKYGBgClxuZXdsaW5lIEZpZ3VyZSAyLiBBIG5vcm1hbGl6ZWQgZGlzdHJpYnV0aW9uIGN1cnZlIFRoZSBkZW5zaXR5IGN1cnZlcyBhcmUgYW5vdGhlciB3YXkgdG8gYW5hbHlzZSBvdXIgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBub3JtYWxpc2F0aW9uIHByb2Nlc3M7IGJlY2F1c2UgdGhleSBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBkYXRhIHNldCwgdGhleSB3b3JrIHBhcnRpY3VsYXJseSB3ZWxsIHdpdGggbGFyZ2VyIGRhdGEgc2V0cy4gVGhlIG1vcmUgZGF0YSB3ZSBjYW4gYWRkIHRvIHRoaXMgY3VydmUsIHRoZSBiZXR0ZXIgd2UnbGwgYmUgYWJsZSB0byBwcmVkaWN0IGFuZCBtb2RlbCBpdC4gV2hpbGUgb3V0bGluZXMgYW5kIGRhdGEgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIGF2ZXJhZ2UgYXJlIG1vcmUgdGhhbiBsaWtlbHkgdG8gYWZmZWN0IHRoZSBleHRyZW1lIGVuZHMgb2YgdGhlIGN1cnZlLCB3ZSBjYW4gc3RpbGwgZGVkdWNlIHRoYXQgdGhvc2Ugd2hvIHN1ZmZlciBmcm9tIE1ERCB3aWxsIGZpbmQgc29tZW9uZSB3aXRoIHdob20gdGhleSBjYW4gY29tZm9ydGFibHkgYWxpZ24gdGhlbXNlbHZlcy4gVGhlIG1vcmUgZGF0YSB3ZSBjYW4gYWRkIHRvIHRoaXMgY3VydmUsIHRoZSBiZXR0ZXIgd2UnbGwgYmUgYWJsZSB0byBwcmVkaWN0IGFuZCBtb2RlbCBpdC4gVGhlIGhpZ2hlciBjdXJ2ZXMgZm9yIHRoZSB5b3VuZ2VzdCBhbmQgb2xkZXN0IG9mIHRoZSBncm91cCBpbiB0aGlzIGRhdGEgc2V0IGFuZCB0aGVzZSBzYW1wbGVzIHNwZWNpZmljYWxseS4gV2hpbGUgdGhlcmUgYXJlIGEgZmV3IHBvaW50cyB3aGVyZSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgdmFyaWFibGUgdmFsdWVzIG1hcHBlZCBhZ2FpbnN0IHRoZSBjdXJ2ZSBmYWxscyBzaG9ydCBvZiB0aGUgbm9uLW5vcm1hbGl6ZWQgZ3JhcGgsIHRoZSBub3JtYWxpc2VkIGdyYXBoIGxhY2tzIGV4dHJhIHZhbHVlcywgcmVwZXRpdGlvbnMgYXJlIHRoZSBtb3N0IGxpa2VseSBjdWxwcml0IGJlY2F1c2UgdGhleSBjb3VudCBmb3IgdHdpY2UgYXMgbXVjaCBhcyB0aGV5IHNob3VsZC4KCiMjIyBOb3JtYWxpemVkIERhdGEgU3RydWN1dHJlCmBgYHtyfQprbml0cjo6a2FibGUodChub3JtYWxpemVkX2RhdGFzdHJ1Y3RbMTo1LF0pLCB0eXBlPSJodG1sIiwpCgpgYGAKVGFibGUgMi4gQSB0YWJsZSB0aGF0IHNob3dzIHRoZSBjb21wbGV0ZWQgbm9ybWFsaXplZCBkYXRhIHN0cnVjdHVyZSBmb3IgdGhpcyBkYXRhc2V0LCB3aXRoIG1hdGNoaW5nIGVuc2VtYmxlIGdlbmUgSURzLCBhbmQgSEdOQyBzeW1ib2xzIGZvciBlYWNoIG9mIHRoZSBzYW1wbGVzLiBUaGlzIGRhdGEgc3RydWN0dXJlIHdhcyBvbmUgb2YgdGhlIGludGVuZGVkIGZpbmFsIHByb2R1Y3RzIG9mIEFzc2lnbm1lbnQgMS4gVGhlIG9iamVjdCBpcyBjYWxsZWQgbm9ybWFsaXplZF9kYXRhc3RydWN0LiAKCgojIyMgRGlmZmVyZW50aWFsIEdlbmUgRXhwcmVzc2lvbiBvbiBOb3JtYWxpemVkIERhdGFzZXQKYGBge1J9CmRlc2lnbl9tb2RlbCA8LSBtb2RlbC5tYXRyaXgofiBkZXNpZ24yJHNhbXBsZV9leHByZXNzaW9uKQptaW5pbWFsX3NldCA8LSBFeHByZXNzaW9uU2V0KG5vcm1hbGl6ZWRfY291bnRzX3BtaWwpCmZpdCA8LSBsaW1tYTo6bG1GaXQobWluaW1hbF9zZXQsIGRlc2lnbl9tb2RlbCkKZml0MiA8LSBsaW1tYTo6ZUJheWVzKGZpdCwgdHJlbmQ9VFJVRSkKdG9wZml0IDwtIGxpbW1hOjp0b3BUYWJsZShmaXQyLCBjb2VmPW5jb2woZGVzaWduX21vZGVsKSwgYWRqdXN0Lm1ldGhvZD0iQkgiLCBudW1iZXI9bnJvdyhub3JtYWxpemVkX2NvdW50c19wbWlsKSkKIyBBZGQgdGhlIGdlbmUgc3ltYm9scwpvdXRwdXRfaGl0cyA8LSBtZXJnZSgKICBkYXRhLmZyYW1lKGdlbmUgPSBnZW5lU3ltSUQsIHJvdy5uYW1lcyA9IHJvd25hbWVzKG5vcm1hbGl6ZWRfY291bnRzX3BtaWwpKSwKICB0b3BmaXQsCiAgYnk9MCwKICBhbGw9VFJVRQopCiMgU29ydCBieSB1bmFkanVzdGVkIHAtdmFsdWUKb3V0cHV0X2hpdHMgPC0gb3V0cHV0X2hpdHNbb3JkZXIob3V0cHV0X2hpdHMkUC5WYWx1ZSwgZGVjcmVhc2luZyA9IEZBTFNFKSxdCm91dHB1dF9oaXRzCmBgYApUYWJsZSAzLiBBIHRhYmxlIHRoYXQgc2hvd3MgdGhlIGZpcnN0IDEwIGdlbmVzIHdpdGggdGhlIGxvd2VzdCBQLXZhbHVlcyBvZiB0aGUgZGF0YXNldC4gVGhpcyB0YWJsZSBpcyBvcmRlcmVkLCBieSB0aGUgUC52YWx1ZSBhdHRyaWJ1dGUgYW5kIHN0YXJ0cyB3aXRoIHRoZSBsb3dlc3QgUC52YWx1ZSBhbmQgZ29lcyB0byB0aGUgbGFyZ2VzdCBQLnZhbHVlLgoKICAgICAgCiMjIyBWb2xjYW5vIFBsb3QKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kdm9sX3Bsb3QgPC0gb3V0cHV0X2hpdHMKCnZvbF9wbG90JGRpZmZleHByZXNzZWQgPC0gIk5vdCBTaWduaWZpY2FudCIKIyBpZiBsb2dGQyA+IDEgYW5kIFAuVmFsdWUgPCAwLjA1LCBzZXQgYXMgIlVwIFJlZ3VsYXRlZCIgCnZvbF9wbG90JGRpZmZleHByZXNzZWRbdm9sX3Bsb3QkbG9nRkMgPiAxICYgdm9sX3Bsb3QkUC5WYWx1ZSA8IDAuMDVdIDwtICJVcCBSZWd1bGF0ZWQiCiMgaWYgbG9nRkMgPCAtMSBhbmQgUC5WYWx1ZSA8IDAuMDUsIHNldCBhcyAiRG93biBSZWd1bGF0ZWQiCnZvbF9wbG90JGRpZmZleHByZXNzZWRbdm9sX3Bsb3QkbG9nRkMgPCAxICYgdm9sX3Bsb3QkUC5WYWx1ZSA8IDAuMDVdIDwtICJEb3duIFJlZ3VsYXRlZCIKCiMgQ3JlYXRlIGEgbmV3IGNvbHVtbiAiZGVsYWJlbCIgdG8gdm9sX3Bsb3QsIHRoYXQgd2lsbCBjb250YWluIHRoZSBuYW1lIG9mIGdlbmVzIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCAoTkEgaW4gY2FzZSB0aGV5IGFyZSBub3QpCnZvbF9wbG90JGRlbGFiZWwgPC0gTkEKdm9sX3Bsb3QkZGVsYWJlbFt2b2xfcGxvdCRkaWZmZXhwcmVzc2VkICE9ICJOb3QgU2lnbmlmaWNhbnQiXSA8LSB2b2xfcGxvdCRnZW5lLmhnbmNfc3ltYm9sW3ZvbF9wbG90JGRpZmZleHByZXNzZWQgIT0gIk5vdCBTaWduaWZpY2FudCJdCgpnZ3Bsb3QoZGF0YT12b2xfcGxvdCwgYWVzKHg9bG9nRkMsIHk9LWxvZzEwKFAuVmFsdWUpLCBjb2w9ZGlmZmV4cHJlc3NlZCwgbGFiZWw9ZGVsYWJlbCkpICsKICAgICAgICBnZW9tX3BvaW50KCkgKyAKICAgICAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgICAgIGdlb21fdGV4dF9yZXBlbCgpICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImJsdWUiLCAiYmxhY2siLCAicHVycGxlIikpICsKICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9YygtMSwgMSksIGNvbD0icmVkIikgKwogICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdD0tbG9nMTAoMC4wNSksIGNvbD0icmVkIikgKwogICAgICAgIGxhYnModGl0bGU9IkFsbCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgd2l0aCBhIHAtdmFsdWUgPCAwLjA1IGZvciBHU0UxOTM0MTciKQpgYGAKXG5ld2xpbmUgRmlndXJlIDMuIEEgdm9sY2FubyBwbG90IHRoYXQgc2hvd3MgdGhlIHNpbmdsZSB1cHJlZ3VsYXRlZCBnZW5lLCBbTVQtQ08xXShodHRwczovL3d3dy51bmlwcm90Lm9yZy91bmlwcm90L1AwMDM5NSkgYW5kIHRoZSA2IGRvd25yZWd1bGF0ZWQgZ2VuZXMgW0dBUzZdKGh0dHBzOi8vd3d3LnVuaXByb3Qub3JnL3VuaXByb3QvUTE0MzkzKSwgW0NDREM5M10oaHR0cHM6Ly93d3cudW5pcHJvdC5vcmcvdW5pcHJvdC9RNTY3VTYpLCBbTUVUUk5dKGh0dHBzOi8vd3d3LnVuaXByb3Qub3JnL3VuaXByb3QvUTlVSkg4KSwgW1RBRjFdKGh0dHBzOi8vd3d3LnVuaXByb3Qub3JnL3VuaXByb3QvUDIxNjc1KSwgW0dBS10oaHR0cHM6Ly93d3cudW5pcHJvdC5vcmcvdW5pcHJvdC9PMTQ5NzYpLCBbV0lGMV0oaHR0cHM6Ly93d3cudW5pcHJvdC5vcmcvdW5pcHJvdC9ROVk1VzUpLiAgCgojIyMgTUEgcGxvdApgYGB7Un0KbGltbWE6OnBsb3RNQShtaW5pbWFsX3NldCwgc3RhdHVzPW91dHB1dF9oaXRzJFAuVmFsdWUgPCAwLjA1LCBtYWluPSJEaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgd2l0aCBhIHAtdmFsdWUgPCAwLjA1IGZvciBHU0UxOTM0MTciKQpgYGAKXG5ld2xpbmUgRmlndXJlIDQuIE1hdGNoZXMgdXAgd2l0aCB0aGUgdm9sYyBwbG90LCB0aGV5IGFyZSBqdXN0IGdyYXBoaWNhbCB0cmFuc2xhdGlvbnMgb2YgZWFjaCBvdGhlci4gVGhlIHBvaW50cywgYW5kIHNwcmVhZCBhbGwgbWF0Y2ggdXAuIAoKIyMjIEhlYXRtYXAKYGBge3J9CiNHZXQgdGhlIHJvd25hbWVzIG9mIGVhY2ggb2YgdGhlIGdlbmVzIHRoYXQgc2F0aXNmeSB0aGUgdGhyZXNob2xkLiAKdG9wSGl0SE0gPC0gb3V0cHV0X2hpdHMkUm93Lm5hbWVzW291dHB1dF9oaXRzJFAuVmFsdWUgPCAwLjA1XQojR2V0IHRoZSBzZWN0aW9ucyBvZiB0aGUgZGF0YSB0aGF0IGFyZSBhbHNvIGluIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkLiAKaGVhdG1hcF9tYXRyaXhfdG9waGl0cyA8LSB0KHNjYWxlKHQobm9ybWFsaXplZF9jb3VudHNfcG1pbFt3aGljaChyb3duYW1lcyhub3JtYWxpemVkX2NvdW50c19wbWlsKSAlaW4lIHRvcEhpdEhNKSxdKSkpCiMKaGVhdG1hcF9jb2wgPC0gY2lyY2xpemU6OmNvbG9yUmFtcDIoYyhtaW4oaGVhdG1hcF9tYXRyaXhfdG9waGl0cyksIDAsIG1heChoZWF0bWFwX21hdHJpeF90b3BoaXRzKSksIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgpoZWF0bWFwIDwtIENvbXBsZXhIZWF0bWFwOjpIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX21hdHJpeF90b3BoaXRzKSwgbmFtZSA9ICJnZW5lIGV4cHIuIHZhbHVlIiwgCiAgY2x1c3Rlcl9yb3dzID0gVFJVRSwgc2hvd19yb3dfZGVuZCA9IFRSVUUsCiAgY2x1c3Rlcl9jb2x1bW5zID0gVFJVRSxzaG93X2NvbHVtbl9kZW5kID0gVFJVRSwKICBjb2w9aGVhdG1hcF9jb2wsc2hvd19jb2x1bW5fbmFtZXMgPSBUUlVFLAogIHNob3dfcm93X25hbWVzID0gRkFMU0Usc2hvd19oZWF0bWFwX2xlZ2VuZCA9IFRSVUUsCiAgY29sdW1uX3RpdGxlID0gIkhlYXRtYXAgb2YgZGlmZi4gZXhwcmVzc2VkIGdlbmVzIHdpdGggYSBwLXZhbHVlIDwgMC4wNSBmb3IgR1NFMTkzNDE3IikKaGVhdG1hcApgYGAKClxuZXdsaW5lIEZpZ3VyZSA1IGlzIGEgaGVhdG1hcCBvZiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgd2l0aGluIHRoZSBkYXRhc2V0LCB3aXRoIHRoZSBzYW1wbGVzIGJlaW5nIHJlcHJlc2VudGVkIGFsb25nIHRoZSBib3R0b20gb2YgdGhlIGhlYXRtYXAuIEdvb2QgY2x1c3RlcmluZyBhbmQgY29uc2lzdGVudCBjbHVzdGVyaW5nIGJldHdlZW4gdGhlIHNhbXBsZXMuIFRoZXJlIGlzIGNvbnNpc3RlbnQgYmFuZGluZyBhbmQgY2x1c3RlcmluZyBvZiBjb2xvdXJzIGFzIHdlbGwuIElmIHlvdSBkaXZpZGUgdGhlIGhlYXRtYXAgaG9yaXpvbnRhbGx5LCByaWdodCBhbG9uZyB0aGUgMCBvZiB0aGUgaGVhdG1hcCwgeW91IGNhbiBzZXBhcmF0ZSBpdCBpbnRvIHR3byBoYWx2ZXMgZm9yIGV2ZXJ5IHNhbXBsZSwgYSB0b3AgaGFsZiB0aGF0IGhhcyBhIHNpZ25pZmljYW50IGNvbG91ciBwYWxldHRlIGFuZCBhIGJvdHRvbSBoYWxmIHdpdGggYW5vdGhlciBkaWZmZXJlbnQgc2lnbmZpY2FudCBjb2xvdXIgcGFsZXR0ZS4gRm9yIHRoZSBtb3N0IHBhcnQsIGVhY2ggaGFsZiBvZiB0aGUgc2FtcGxlIGlzIGRvbWluYXRlZCBieSBlaXRoZXIgcHVycGxlLWlzaCBvciBvcmFuZ2UtaXNoIGNvbG91ci4gRm9yIGV4YW1wbGUsIENSSC1IdTEwMDEgaXMgYSBzYW1wbGUgdGhhdCBzdWZmZXJzIHdpdGggTURELCB0aGUgdG9wIGhhbGYgaXMgcHJpbWFyaWx5IHB1cnBsZSwgd2hpbHN0IHRoZSBib3R0b20gaGFsZiBpcyBwcmltYXJpbHkgb3JhbmdlLiBUaGlzIHBhdHRlcm4gd2hlcmUgdGhlIHRvcCBpcyBwdXJwbGUgYW5kIHRoZSBib3R0b20gaXMgb3JhbmdlIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBNREQgc2FtcGxlcywgYW5kIGZvciBjb250cm9scywgbGlrZSBDUkgtSHUxMDMxIHRoZSB0b3AgaGFsZiBpcyBwcmltYXJpbHkgb3JhbmdlLCB3aGlsc3QgdGhlIGJvdHRvbSBoYWxmIGlzIHByaW1hcmlseSBwdXJwbGUuIAoKIyMgQW5zd2VycyB0byBRdWVzdGlvbnMKMS4gYSkgQ2FsY3VsYXRlIHAtdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBnZW5lcyBpbiB5b3VyIGV4cHJlc3Npb24gc2V0LiBiKSBIb3cgbWFueSBnZW5lcyB3ZXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkPyBjKSBXaGF0IHRocmVzaG9sZHMgZGlkIHlvdSB1c2UgYW5kIHdoeT8KYSkgRm9yIHRoZSBwLXZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZ2VuZXMgaW4gdGhlIGV4cHJlc3Npb24gc2V0LCBwbGVhc2Ugc2VlIFRhYmxlIDMuCmIpIGByIGxlbmd0aCh3aGljaChvdXRwdXRfaGl0cyRQLlZhbHVlIDwgMC4wNSkpYCBvciBgciAoKGxlbmd0aCh3aGljaChvdXRwdXRfaGl0cyRQLlZhbHVlIDwgMC4wNSkpKS9sZW5ndGgocm93bmFtZXMob3V0cHV0X2hpdHMpKSkgKiAxMDBgJSBvZiB0aGUgMTUzNDEgbm9ybWFsaXplZCBhbmQgY2xlYW5lZCBnZW5lcy4gCmMpIEkgZGlkIG5vdCB1c2UgYW55IHRocmVzaG9sZHMgdG8gbGltaXQgdGhlIGRhdGEgaW4gdGhpcyBwb3J0aW9uLiBNeSByZWFzb25pbmcgZm9yIGRvaW5nIHRoaXMgaXMgYmVjYXVzZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGdlbmVzIHRoYXQgcGFzc2VkIHRoZSBzaWduaWZpY2FudCBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbHJlYWR5IGJlaW5nIHVuZGVyIHRoZSBQLXZhbHVlIHRocmVzaG9sZCBvZiA1JSwgIEkgZm91bmQgaXQgdW5uZWNlc3NhcnkuIEl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBmdXJ0aGVyIGxpbWl0IHRoZSB2YWx1ZXMgYW5kIGRhdGEgd2hlbiBpdCBhbHJlYWR5IGlzIHVuZGVyIHRoZSByYW5nZSB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4gTWVhbmluZyB0aGF0IHRoZXJlIGFyZSBnZW5lcyB3aXRoIHN0cm9uZyBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiwgYW5kIGluIHRoaXMgY2FzZSBpdCBpcyBgciBsZW5ndGgod2hpY2gob3V0cHV0X2hpdHMkUC5WYWx1ZSA8IDAuMDUpKWAgb2YgdGhlbS4gTm93LCB3ZSBjYW4gYWRqdXN0IGZvciBhbnkgaXJyZWd1bGFyaXRpZXMgYW5kIHBlcmZvcm0gc29tZSBoeXBvdGhlc2lzIGNvcnJlY3Rpb25zLiBUaG91Z2ggdG8gY2xhcmlmeSwgSSBhbSBtYWtpbmcgbXkgUC5WYWx1ZSB0aHJlc2hvbGQgb2YgMC4wNSwgYXMgdGhpcyBpcyA1JSwgZW5vdWdoIHRvIHJlamVjdCB0aGUgbnVsbCBocG90aGVzaXMsIHNpZ25pZnlpbmcgc3Ryb25nIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFzIEkgc3RhdGVkIGJlZm9yZSwgYnV0IGJleW9uZCB0aGlzIHRocmVzaG9sZCwgSSBkaWQgbm90IGhhdmUgYW5vdGhlciBhcyBpdCB3YXMgbm90IHJlcXVpcmVkIGFzIHN0YXRlZCBlYXJsaWVyLiBTbywgdGhyZXNob2xkIHdhcyBQLlZhbHVlIDwgMC4wNSwgYnV0IG5vdGhpbmcgZnVydGhlci4gCgoyLiBNdWx0aXBsZSBoeXBvdGhlc2lzIHRlc3RpbmcgLSBjb3JyZWN0IHlvdXIgcC12YWx1ZXMgdXNpbmcgYSBtdWx0aXBsZSBoeXBvdGhlc2lzIGNvcnJlY3Rpb24gbWV0aG9kLiAKYSkgV2hpY2ggbWV0aG9kIGRpZCB5b3UgdXNlPyBBbmQgV2h5PyBiKSBIb3cgbWFueSBnZW5lcyBwYXNzZWQgY29ycmVjdGlvbj8KYSkgVGhlIG1ldGhvZCBJIHVzZWQgd2FzIHRoZSBCZW5qYW1pbmktSG9jaGJlcmcgKEJIKSBjb3JyZWN0aW9uIG1ldGhvZC4gVGhpcyBpcyBtYWlubHkgZHVlIHRvIHRoZSBmYWN0IHRoYXQgaXQgaXMgdGhlIG1vc3Qgd2lkZWx5IHVzZWQgb2YgdGhlIG1ldGhvZHMsIGl0IHdvcmtzIHJlYWxseSB3ZWxsIGZvciBzbWFsbGVyIHNhbXBsZSBzaXplcywgd2hpY2ggaXMgdGhlIGNhc2UgZm9yIHVzLCB3aXRoIGRhdGEgc2V0LCBhbmQgbGFzdGx5IGl0IGlzIHRoZSBtb3N0IGxlbmllbnQgb2YgdGhlIFAtdmFsdWUgYWRqdXN0bWVudCBtZXRob2RzLiBTaW5jZSB0aGUgc2FtcGxlIHNpemUgaXMgc28gc21hbGwsIHdlIG1pZ2h0IG5vdCBoYXZlIG11Y2ggdmFyaWF0aW9uLiBUaG91Z2gsIGR1ZSB0byB0aGlzIG1ldGhvZCwgMCBnZW5lcyBwYXNzZXMgY29ycmVjdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgdG8gc2F5IHRoZSBsZWFzdC4gIApiKSBUaGUgbnVtYmVyIG9mIGdlbmVzIHRoYXQgcGFzc2VkIGNvcnJlY3Rpb24gaXM6IGByIGxlbmd0aCh3aGljaChvdXRwdXRfaGl0cyRhZGouUC5WYWwgPCAwLjA1KSlgLgoKCjMuIFNob3cgdGhlIGFtb3VudCBvZiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgdXNpbmcgYW4gTUEgUGxvdCBvciBhIFZvbGNhbm8gcGxvdC4gSGlnaGxpZ2h0IGdlbmVzIG9mIGludGVyZXN0LiBcbmV3bGluZQpGb3IgdGhpcyBxdWVzdGlvbiBwbGVhc2Ugc2VlIEZpZ3VyZSA0IGFuZCBGaWd1cmUgNSBhYm92ZSwgYW4gTUEgUGxvdCBhbmQgVm9sY2FubyBwbG90IHJlc3BlY3RpdmVseS4gUGxlYXNlIHBheSBzcGVjaWFsIG5vdGUgdG8gdGhlIFZvbGNhbm8gcGxvdCwgd2hlcmUgaXQgaGlnaGxpZ2h0cyB0aGUgZ2VuZXM7IGRvd25yZWd1bGF0ZWQsIEdBUzYsIENDREM5MywgTUVUUk4sIFRBRjEsIEdBSywgV0lGMSBhbmQgdXAgcmVndWxhdGVkLCBNVC1DTzEgZGF0YSBwb2ludHMuIFRoaXMgaXMgcmVhbGx5IGludGVyZXN0aW5nIGJlY2F1c2UgdGhlc2UgInN0YXJzIiBwZXJzZSBhcmUgbXVjaCBmdXJ0aGVyIG91dCB0aGF0IHRoZSByZXN0IG9mIHRoZSBjbHVzdGVyIG9mIHRoZSBkYXRhc2V0LiBJbiB0aGUgTUEgcGxvdCwgeW91IGNhbiBzZWUgdGhlIG91dGxpZXJzIHNpbXBseSBzaWduaWZlZCBhcyBkb3RzLCBhcyB0aGUgTUEgcGxvdCBhbmQgVm9sY2FubyBwbG90IGFyZSBncmFwaCB0cmFuc2xhdGlvbnMsIGdyYXBoZWQgb24gdGhlIGFudGktYXhpcyBvZiBvbmUgYW5vdGhlci4gWW91IGNhbiBzZWUgdGhlIHZlcnkgc2ltaWxhciBncm91cGluZyBzdHJ1Y3R1cmUgYXJvdW5kIHRoZSBvcmlnaW4gb2YgZWFjaCBncmFwaC4gSW4gdGhlIE1BIHBsb3QsIHRoZSBzY2F0dGVyIGlzIG1vcmUgc3ByZWFkIG91dCBkdWUgdG8gdGhlIGxhcmdlciBzY2FsZSByZXN1bHRpbmcgZnJvbSB0aGUgY2hhbmdlIGJhc2UsIG9mIGxvZzIgdG8gbG9nMTAsIGFuZCB0aGUgYXZlcmFnZSBvZiBzYWlkIGxvZyBleHByZXNzaW9ucy4gQm90aCBlc3NlbnRpYWxseSByZXByZXNlbnQgdGhlIHNhbWUgdGhpbmcsIHRoYXQgdGhlcmUgYXJlIGEgbWFqb3IgbnVtYmVyIG9mIGdlbmVzIHRoYXQgYXJlIGV4cHJlc3NlZCB3aXRoIGEgUC12YWx1ZSBvZiBsZXNzIHRoYW4gMC4wNS4gRm9yIGJvdGggcGxvdCwgRmFsc2Ugb3IgaW5zaWduaWZpY2FudCB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGluIGJsYWNrIGNvbG91ci4gVGhlIFZvbGNhbm8gcGxvdCBpcyBqdXN0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHVwIG9yIGRvd24gcmVndWxhdGlpb24gZm9yIHRoZSBUcnVlIHZhbHVlcy4gV2l0aCB0aGlzIGluIG1pbmQsIGFuZCB0aGUgcmVkdW5kYW5jeSBmdXJ0aGVyIHN1cHBvcnRpbmcgbXkgY2xhaW1zLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGVyZSBpcyBtb3N0IGxpa2VseSBnZW5lIHN0cm9uZyBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uLiAKCgo0LiBWaXN1YWxpemUgeW91ciB0b3AgaGl0cyB1c2luZyBhIGhlYXRtYXAuIERvIHlvdSBjb25kaXRpb25zIGNsdXN0ZXIgdG9nZXRoZXI/IEV4cGxhaW4gd2h5IG9yIHdoeSBub3QuIFxuZXdsaW5lClllcyB0aGVyZSBpcyBhIGNsZWFyIGNsdXN0ZXJpbmcgZHVlIHRvIHRoZSBjb25kaXRpb25zIG9mIHRoZSBleHBlcmltZW50LCBhbmQgc2FtcGxlIHR5cGUuIFRob3NlIHRoYXQgaGF2ZSBNREQgYW5kIHRob3NlIHRoYXQgYXJlIGNvbnRyb2xzIGhhdmUgdmVyeSBzaW1pbGFyIGdlbmUgZXhwcmVzc2lvbnMuIFBsZWFzZSBzZWUgRmlndXJlIDUncyBkZXNjcmlwdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gSW4gc3VtbWF0aW9uIG9mIHRoZSBkZXNjcmlwdGlvbiwgdGhvc2Ugd2l0aCBNREQgaGF2ZSBhIHVuaXF1ZSBjb2xvdXIgcGF0dGVybiBvbiB0aGUgaGVhdG1hcCwgYW5kIGluZGl2aWR1YWxzIHdpdGggc2FpZCBwYXR0ZXJuIGNhbiBiZSBpZGVudGlmaWVkIHRoYXQgd2F5IChwdXJwbGUtaXNoIHRvcCwgb3JhbmdlLWlzaCBib3R0b20pLiBTaW1pbGFybHksIGluZGl2aWR1YWxzIHRoYXQgZG8gbm90IHN1ZmZlciBmcm9tIE1ERCBoYXZlIGEgdW5pcXVlIHBhdHRlcm4gcHVycGxlLWlzaCBib3R0b20sIG9yYW5nZS1pc2ggdG9wLiBXaGF0IHRoaXMgYmFzaWNhbGx5IHN0YXRlcyBpcyB0aGF0IHRoZXJlIGlzIGEgY2xlYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGdlbmVzIGFuZCB0aGVpciBlZmZlY3RzLiBQcmV0dHkgaW50ZXJlc3RpbmcgdGhhdCB0aGVyZSBpcyBhbHNvIGEgdmlzdWFsIHNpbWlsYXJpdHkuIEhvd2V2ZXIsIEkgc2hvdWxkIG5vdGUgdGhhdCB0aGlzIG1pZ2h0IGp1c3QgYmUgYSBjb2luY2lkZW5jZSBhbmQgbGlrZSBzdGF0ZWQgaW4gdGhlIHBhcGVyIGFzIHdlbGwgYXMgaW4gQTEsIGEgbGFyZ2VyIHNhbXBsZSBzaXplIGNvdWxkIGhhdmUgbWFkZSB0aGUgcmVsYXRpb25zaGlwIG1vcmUgb3IgbGVzcyBhcHBhcmVudC4gU3RpbGwgYSBwcmV0dHkgbmVhdCB0aGluZyEgU28gaW4gc2hvcnQsIHRoZSBwdXJwbGUgbWVhbnMgdGhlcmUgaXMgZG93bnJlZ3VsYXRlZCBleHByZXNzaW9uIGFuZCB0aGUgb3JhbmdlIG1lYW5zIHRoZXJlIGlzIHVwcmVndWxhdGVkIGV4cHJlc3Npb24gZm9yIHRoZSByZXNwZWN0aXZlIGdlbmVzLgoKIyBUaHJlc2hvbGRlZCBvdmVyLXJlcHJlc2VudGF0aW9uIGFuYWx5c2lzCgojIyMgQ3JlYXRlIGxpc3RzIG9mIGFsbHJldXByZWd1bGF0ZWQsIGRvd25yZWd1bGF0ZWQgZ2VuZXM6CmBgYHtyfQphbGxfdXBfZW5zIDwtIG91dHB1dF9oaXRzJGdlbmUuZW5zZW1ibF9nZW5lX2lkW291dHB1dF9oaXRzJFAuVmFsdWUgPD0gMC4wNSAmIG91dHB1dF9oaXRzJGxvZ0ZDID49IDBdCmFsbF91cF9oZ25jIDwtIG91dHB1dF9oaXRzJGdlbmUuaGduY19zeW1ib2xbb3V0cHV0X2hpdHMkUC5WYWx1ZSA8PSAwLjA1ICYgb3V0cHV0X2hpdHMkbG9nRkMgPj0gMF0KYWxsX2Rvd25fZW5zZyA8LSBvdXRwdXRfaGl0cyRnZW5lLmVuc2VtYmxfZ2VuZV9pZFtvdXRwdXRfaGl0cyRQLlZhbHVlIDw9IDAuMDUgJiBvdXRwdXRfaGl0cyRsb2dGQyA8PSAwXQphbGxfZG93bl9oZ25jIDwtIG91dHB1dF9oaXRzJGdlbmUuaGduY19zeW1ib2xbb3V0cHV0X2hpdHMkUC5WYWx1ZSA8PSAwLjA1ICYgb3V0cHV0X2hpdHMkbG9nRkMgPD0gMF0Kd3JpdGUudGFibGUoYWxsX3VwX2VucywgZmlsZSA9ICJhbGxfdXBfZW5zLnR4dCIsIHNlcD0iXG4iLCByb3cubmFtZXMgPSBGQUxTRSxjb2wubmFtZXMgPSBGQUxTRSxxdW90ZSA9IEZBTFNFKQp3cml0ZS50YWJsZShhbGxfdXBfaGduYywgZmlsZSA9ICJhbGxfdXBfaGduYy50eHQiLCBzZXA9IlxuIiwgcm93Lm5hbWVzID0gRkFMU0UsY29sLm5hbWVzID0gRkFMU0UscXVvdGUgPSBGQUxTRSkKd3JpdGUudGFibGUoYWxsX2Rvd25fZW5zZywgZmlsZSA9ICJhbGxfZG93bl9lbnNnLnR4dCIsIHNlcD0iXG4iLCByb3cubmFtZXMgPSBGQUxTRSxjb2wubmFtZXMgPSBGQUxTRSxxdW90ZSA9IEZBTFNFKQp3cml0ZS50YWJsZShhbGxfZG93bl9oZ25jLCBmaWxlID0gImFsbF9kb3duX2hnbmMudHh0Iiwgc2VwPSJcbiIsIHJvdy5uYW1lcyA9IEZBTFNFLGNvbC5uYW1lcyA9IEZBTFNFLHF1b3RlID0gRkFMU0UpCmFsbF91cCA8LSBhcHBlbmQoYWxsX3VwX2VucywgYWxsX3VwX2hnbmMpCmFsbF9kb3duIDwtIGFwcGVuZChhbGxfZG93bl9lbnNnLCBhbGxfZG93bl9oZ25jKQphbGx2YWx1ZXMgPC0gYXBwZW5kKGFsbF91cF9oZ25jLCBhbGxfZG93bl9oZ25jKQphbGx2YWx1ZXNuYW1lZCA8LSBhcHBlbmQoYWxsX3VwLCBhbGxfZG93bikKYGBgCgoKIyMjIGc6cHJvZmlsZXIgZm9yIE9SQSBkaWZmZXJlbnR1YWxseSBleHByZXNzZWQgZ2VuZXM6CmBgYHtyLCBmaWcuY2FwPSJGaWd1cmUgNkE6IE1hbmhhdHRhbiBQbG90IG9mIE9SQSByZXN1bHRzIGZvciBhbGwgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIn0KZ29zdHJlc3RwMSA8LSBnb3N0KGFsbHZhbHVlc25hbWVkLCBzb3VyY2VzPWMoIkdPOkJQIiwgIkdPOk1GIiwgIkdPOkNDIiwgIktFR0ciLCAiSFBBIiwgIkhQIiwgIlJFQUMiKSkKZ29zdHBsb3QoZ29zdHJlc3RwMSwgY2FwcGVkID0gRkFMU0UsIGludGVyYWN0aXZlID0gVFJVRSkKYGBgCgpcbmV3bGluZSBGaWd1cmUgNkEgaXMgYSBNYW5oYXR0YW4gUGxvdCB3aGF0IHNob3dzIHRoZSBoaXRzIGFuZCBnZW5lcyBmcm9tIHRoZSBkaWZmZXJlbnQgYW5ub3RhdGlvbiBkYXRhYmFzZXMuIFRoaXMgaW5jbHVkZXMgYm90aCBkb3ducmVndWxhdGVkIGFuZCB1cHJlZ3VsYXRlZCBnZW5lcyBmb3IgdGhpcyBkYXRhc2V0LiBUaGUgbGFyZ2UgbnVtYmVycyBvZiBoaXRzIGZyb20gSFBBLCBHTzpCUCwgR086Q0MuIEdPOk1GIG1ha2Ugc2Vuc2UgYmVjYXVzZSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZ2VuZXMgdGhhdCBhY2NvdW50IGZvciBkaWZmZXJlbnQgcHJvY2Vzc2VzLCBpLmUuIG1vbGVjdWxhciBmdW5jdGlvbiBnZW5lcywgY2VsbHVsYXIgY29tcG9uZW50cywgaHVtYW4gcHJvdGVpbnMgZXRjLiBhbmQgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIHJldHVybnMgZnJvbSB0aGVzZSBhbm5vdGF0aW9ucyBkYXRhYmFzZXMgbWFrZSBzZW5zZS4gV2UgY2FuIHZlcmlmeSB0aGlzIGJ5IGp1c3QgbG9va2luZyBhdCBzb21lIG9mIHRoZSBoaXRzIGZyb20gb3VyIHZvbGNhbm8gcGxvdCBlYXJsaWVyIGFuZCBzZWUgdGhhdCBtYW55IG9mIHRoZSBnZW5lcyB0aGF0IGFyZSByZWd1bGF0ZWQgZG8gaW5kZWVkIGZhbGwgdW5kZXIgdGhlIGZ1bmN0aW9ucyBhbmQgZGF0YWJhc2VzIHRoZXkgaGF2ZSBwaW5nZWQgZnJvbS4gSGVyZSBpcyBhIGxpc3Qgb2YgdGhlbSBmb3IgcmVmZXJlbmNlOyBbTVQtQ08xXShodHRwczovL3d3dy51bmlwcm90Lm9yZy91bmlwcm90L1AwMDM5NSkgW0dBUzZdKGh0dHBzOi8vd3d3LnVuaXByb3Qub3JnL3VuaXByb3QvUTE0MzkzKSwgW0NDREM5M10oaHR0cHM6Ly93d3cudW5pcHJvdC5vcmcvdW5pcHJvdC9RNTY3VTYpLCBbTUVUUk5dKGh0dHBzOi8vd3d3LnVuaXByb3Qub3JnL3VuaXByb3QvUTlVSkg4KSwgW1RBRjFdKGh0dHBzOi8vd3d3LnVuaXByb3Qub3JnL3VuaXByb3QvUDIxNjc1KSwgW0dBS10oaHR0cHM6Ly93d3cudW5pcHJvdC5vcmcvdW5pcHJvdC9PMTQ5NzYpLCBbV0lGMV0oaHR0cHM6Ly93d3cudW5pcHJvdC5vcmcvdW5pcHJvdC9ROVk1VzUpLiAKCkhlcmUgaXMgdGhlIGxpbmsgdG8gW2dwcm9maWxlcl0oKGh0dHBzOi8vYmlpdC5jcy51dC5lZS9ncHJvZmlsZXIvZ29zdD9vcmdhbmlzbT1oc2FwaWVucyZxdWVyeT1IQURIQiUwQVNDQVBFUiUwQVBVTTElMEFDRVA0MSUwQVBDR0Y1JTBBUFBQMVIyMSUwQUlHRkJQNiUwQUhNR1hCNCUwQVBETElNNyUwQUJSRFQlMEFDTENONCUwQUVQRFIxJTBBSDJCQzUlMEFDUkVHMiUwQUdQWDQlMEFaTkYxMiUwQUFSTDhCJTBBUklNS0xBJTBBUkVFUDElMEFGS0JQMTUlMEFGQU0xMTdCJTBBTU9YRDElMEFQTEVLSEQxJTBBVE9SM0ElMEFSQURYJTBBUFlNMSUwQUtJQUEwMTAwJTBBU1RBTUJQJTBBTkxHTjRZJTBBU0xDNEE3JTBBQ09MMjNBMSUwQVNUMTMlMEFFRE5SQSUwQU5MR040WCUwQURTVE4lMEFNTUFDSEMlMEFOQ09BMSUwQUVMTU9EMSUwQVJDQU4zJTBBS0NURDIlMEFMWVJNNyUwQVVOQzExOSUwQVBSTkQlMEFMUlJDMTUlMEFQU0QzJTBBTFJCQSUwQUZCWEwxNCUwQUNFUDE5JTBBSE5STlBSJTBBQUJIRDExJTBBQUNUUjIlMEFOUkFQJTBBVUNLTDElMEFJVEZHMSUwQUNNUEsyJTBBRFVTUDEyJTBBWk5GNDI1JTBBVUJFMkQxJTBBVUJBNSUwQUVSQkIzJTBBSVBPNSUwQVRNOVNGMyUwQU5QQVMzJTBBSExBLURQQTElMEFHU1RBNCUwQUNDUjklMEFSQVNTRjIlMEFQSEtHMSUwQVNNT0MyJTBBU0tBMiUwQUNUTk5BMyUwQVJQU0ElMEFBVFA1RjFCJTBBUkdNQSUwQUtMSERDMSUwQVNDQVJCMiUwQVBSS0RDJTBBQ09CTCUwQU1FRDEzTCUwQUlaVU1PNCUwQVpVUDElMEFBMk0lMEFUTUVNMjQxJTBBUEFSUDQlMEFHT0xNMSUwQUtJRjE1JTBBUENZVDFCJTBBVFlSTzMlMEFQRUExNSUwQUxJUEglMEFDTlRONiUwQU1MTFQzJTBBVEVYNTIlMEFVQkFMRDIlMEFDSE1QNSUwQVpCVEI0MCUwQUdHSCUwQVBHTTJMMSUwQVNVR1QxJTBBSEhBVEwlMEFFTEFQT1IyJTBBTFlSTTIlMEFQT0xBMiUwQUlGTkFSMSUwQUtDTko1JTBBU0gyRDRBJTBBTFBDQVQyJTBBWk5GNzMwJTBBTlVDQjIlMEFEVVNQOCUwQUtSVENBUDIlMEFPTEZNMyUwQVdJUEYyJTBBUFJTUzIzJTBBRExDMSUwQUREWDMxJTBBRUkyNCUwQUdNUFIlMEFMWTZIJTBBTkNBUEgyJTBBWk5GOTklMEFGUkcxJTBBWk5GNzQwJTBBTFJNREElMEFXRFI0JTBBVFJJTTE2TCUwQUdJTlMxJTBBTlhQRTElMEFHQUJSUCUwQUFQQkIxSVAlMEFKQUtNSVAxJTBBREVOTkQ2QiUwQUNPWDdDJTBBU0gzUkYyJTBBQ0lCMiUwQVRITlNMMiUwQU5DT0EzJTBBRVNBTSUwQUNEUlQxJTBBQ0JXRDUlMEFTRVJQSU5COCUwQUZHRjElMEFOVEFRMSUwQUNFUlMyJTBBTk9YNCUwQVNMQzlBMiUwQVpORjI4NkElMEFSUFMxNUElMEFHU04lMEFLTEhMMzglMEFIUk9CJTBBR0lQQzMlMEFNT0slMEFIRVhJTTIlMEFaTkYxMDYlMEFMT1hMNCUwQU9MRk00JTBBVE1FTTEyOCUwQVBSWEwyQSUwQVNUVDNBJTBBQURHUkUxJTBBU05YMjklMEFTRU1BNEYlMEFPUjlRMSUwQVlJUEY0JTBBUFRLMkIlMEFEUFlTTDMlMEFFRk5CMSUwQUNEMzQlMEFDRDMzJTBBRFRMJTBBQkFDRTIlMEFPU0NBUiUwQVRNRU0xNDQlMEFHVEYySDMlMEFGWkQ2JTBBR1RQQlA4JTBBUElHQSUwQVpORjU1MCUwQVNBVjElMEFDVUw0QSUwQUNFTEEzQiUwQUFGQVAxTDElMEFQSUszQzJHJTBBUFhUMSUwQVRSTVQyQiUwQVNUQVJENCUwQUxJTFJBMSUwQUNMTjMlMEFTTEM4QTElMEFBVFAyQjQlMEFGRkFSNCUwQVVCQTIlMEFJTkNBMSUwQVdOVDhCJTBBUk5GNCUwQUxSUkM2MyUwQVRNRU05QiUwQVNTVCUwQVpORjQyNiUwQUxSUkM3NEIlMEFFWFBINSUwQUVGSEIlMEFUQURBMkElMEFDQU1TQVAyJTBBTUFSRjElMEFUVExMNCUwQU9SMlczJTBBTlJTTjElMEFBUlBQMjElMEFXRFI1MyUwQUNEMTA5JTBBUElUSEQxJTBBR1JQRUwyJTBBR1RGM0MxJTBBSU5UUzklMEFUTVBSU1MxMUQlMEFUTUVNMTgyJTBBU1VMVDFCMSUwQUNDUjMlMEFFTkFIJTBBUFREU1MxJTBBRE5BQUYxMSUwQUhMQ1MlMEFDTFBUTTElMEFNRUdGOSUwQVRQUktCJTBBU0FNRDRBJTBBSEVYQiUwQVBDREhCOCUwQU1SRUclMEFFUkxFQzElMEFPVFVENCUwQVpORjQzMCUwQVNSUDklMEFaTkYyMjElMEFDQ1QyJTBBSERIRDMlMEFHUFI4NCUwQVRNMkQxJTBBSUZUMTcyJTBBU1BBRzElMEFDTFRDJTBBQ0ZIUjQlMEFCT1JDUzYlMEFMSU1EMiUwQU5VRFQxNCUwQUNESDglMEFHUFIxMDglMEFCUkYyJTBBV05LNCUwQURFUFRPUiUwQVRNRU0xMDglMEFFUFM4TDElMEFURFJEMTIlMEFDTVRSMSUwQUROTTMlMEFNVC1DTzElMEFPU0JQTDklMEFIQVgxJTBBTk9QMTAlMEFBSVAlMEFHUEFUQ0gyJTBBSENOMSUwQU1TUjElMEFUTUVNMTI2QiUwQVNMQzE5QTMlMEFMU00xNEIlMEFaQlRCMjUlMEFFUlZWLTElMEFOT01PMiUwQVBBUkclMEFSQUI2QyUwQUFBUlNEMSUwQUNESDEzJTBBU0VMRU5CUDElMEFBQkhEMTRBJTBBQUxESDNCMSUwQUdDTTIlMEFFTFAzJTBBR0FTNiUwQUNDREM5MyUwQU1FVFJOJTBBVEFGMSUwQVdJRjElMEFHQUslMEFQTEVLSE8xJTBBU05SUEIlMEFNQVBLNCUwQVBBQ1NJTjIlMEFNWU85QiUwQUNBQ05CNCUwQVpORjUxMkIlMEFNUlBTMiUwQUFEQU0yMCUwQUVCRjQlMEFQT0xSMk0lMEFaRkhYMiUwQVJBU0E0QiUwQU1JQjIlMEFFVkExQyUwQVNOUEglMEFUQ0YyMCUwQVBJRVpPMSUwQU5VRFQxMyUwQUFOS1JEMjklMEFOUEFTMiUwQUROQUFGNSUwQVNFQzE2QSUwQUZBUlAxJTBBQVRGNCUwQVBDTlQlMEFLTVQyQSUwQUZCWE8yMSUwQU9SQUkyJTBBQ0hBRjFBJTBBTUVGMkQlMEFFSUQzJTBBQURHUkcxJTBBTk9MNCUwQUFSRjElMEFQUk9aJTBBUEhSRjElMEFSWFJBJTBBQ0FQTjEyJTBBQVRHNEIlMEFSQ0MyJTBBQUdPMiUwQVJJTUtMQiUwQUNBTVNBUDElMEFIWUFMMSUwQUNESzExQiUwQUZBTTIxOUElMEFDWVRIMiUwQUZOREMzQSUwQUNFTkFUQUMlMEFNVFNTMiUwQVJCQlA3JTBBQ0RDMjVCJTBBQU5LUkQzOSUwQU1BUFJFMyUwQU5DTE4lMEFFSEJQMUwxJTBBUkFCMTFGSVA0JTBBTVJQTDQ1JTBBUk1ORDVBJTBBQUxZUkVGJTBBTUlEMUlQMSUwQVNSUDE0JTBBUE5QTEE3JTBBR0lEOCUwQUJDTDExQiUwQVJORjE4NyUwQUtDTk4yJTBBQUtUMiUwQVRNRU0xMjElMEFNQ0YyTDIlMEFNQU1EQzQlMEFTTUlNMzIlMEFGR0YyMiUwQVNQQVRBMTMlMEFTTEMyMkEyMyUwQVRSUkFQJTBBUkJNMjglMEFTVE1OMyUwQUJNUzElMEFCSUNETDElMEFISVZFUDIlMEFQTEs1JTBBVEdGQlJBUDElMEFEQVpBUDElMEFDQU1LSzElMEFQTElONSUwQVRSQVBQQzklMEFVVFAyMCUwQUlUUFJJUEwyJTBBRElQMkMlMEFDQ0RDMTM0JTBBU0VMRU5PTyUwQU1NQUElMEFTQ0FSRjIlMEFBU1BIRDElMEFaTkYzMTglMEFDMTdvcmY1OCUwQVBQT1glMEFQUFAxUjEwJTBBWk5GNDk3JTBBRkJYTDYlMEFaTkY3MSUwQU5BQTE2JTBBQUJDQzEwJTBBU05YMzMlMEFQR0xZUlAxJTBBQVVUUzIlMEFUTVVCMiUwQVNQMyUwQVRNRUQ4JTBBUUtJJTBBQ0hTVDclMEFGWFlEMiUwQUtJQUEwOTMwJTBBQkFIQ0MxJTBBTUFTVDElMEFOQUNDMSUwQUNMSVAyJTBBQ1NOSzFEJTBBWVdIQVElMEFORVRPMSUwQUNMQVNQMSUwQUlRU0VDMSUwQUhTNlNUMSUwQURDSFMxJTBBQ0VOUEslMEFFWE9TQzMlMEFTVFVCMSUwQUNES04xQSUwQUxBVCUwQVNOUk5QMjUlMEFVMkFGMiUwQVJBU0dFRjFDJTBBQkFJQVAyTDIlMEFQREUyQSUwQVNOQUkzJTBBU0dTTTMlMEFJTDMxUkElMEFGQU0yMjJBJTBBVFVCQjJCJTBBQ0NEQzg1QSUwQVNISVNBNyUwQVdEUjg5JTBBU0lHSVJSJTBBUERFNUElMEFQQ0RIQTglMEFTREYyTDElMEFPR0RITCUwQUNIUk5BNCUwQU5QUjIlMEFCQ0FUMiUwQVlKRUZOMyUwQVJIQ0clMEFQU01DM0lQJTBBQUxESDhBMSUwQVNQQUNBNiUwQUFMS0JINCUwQU1YUkE3JTBBU0lHTEVDMSUwQUNZUDJKMiUwQUFERDMlMEFQRFpENCUwQUNBQ05BMUIlMEFNQUlQMSUwQVNMQUlOMSUwQVNMQzI1QTUzJTBBUkNFMSUwQUROQUkxJTBBQVJIR0VGMTBMJTBBU0YzQjQlMEFJVEdCMSUwQVBTTUQ1JTBBTVBQMiUwQVNVUFQ1SCUwQUFER1JBMSUwQUZBTTE1NkIlMEFUQVMxUjMlMEFTTkNCJTBBRk9YSzElMEFUWVcxQiUwQVRNOVNGMSUwQU1BRDJMMiUwQVBFWDI2JTBBU0xDMTJBMiUwQVRZTVAlMEFaQzNINCUwQVRNRU0xODElMEFLUlQyMyUwQU1ER0EyJTBBU0VURDFCJTBBR1BCUDFMMSUwQURQWUQlMEFGQlhXOSUwQUVQSFg0JTBBTkVMRkUlMEFGQUFIJTBBTlVNQkwlMEFTVEFSRDclMEFSQUIzNiUwQVJCTVMxJTBBTkdSTiUwQU5BRFNZTjElMEFDWVAyQjYlMEFQSFlIJTBBWVkxQVAxJTBBUlRMMSUwQUdBQlJCMSUwQUxFTkcxJTBBUFJLUklQMSUwQU5PVkEyJTBBUEhZS1BMJTBBU1JFQkYxJTBBTElYMSUwQUMzb3JmNDklMEFQSFlISVAlMEFTRUxFTk9LJTBBU0FNRDRCJTBBRzZQRCUwQU5BUlMyJTBBQ1JFTEQxJTBBQVRHMTQlMEFOQVQxNiUwQUMxMW9yZjcxJTBBTFBBJTBBQ0FDTkExSSUwQVRNQ0MxJTBBUFVSQiUwQUNFUDM1MCUwQURMRzMlMEFOQVYxJTBBQ0RLMTAlMEFDQVBOMiUwQU1VQ0wxJTBBU1BUQiUwQUtIU1JQJTBBQzdvcmY1MCUwQUhHSDElMEFQUlI3JTBBTkFUOEwlMEFUTlJDNkMlMEFaQzNIN0IlMEFDRkFQOTElMEFNWUw2JTBBVEFSUzIlMEFBUkhHRElBJTBBU05STlAyMDAlMEFQSVRQTk0zJTBBSUw1JTBBT1NCUEwyJTBBTEFUUzElMEFOUERDMSUwQVBLRENDJTBBUExBMkc0RCUwQUNQRUQxJTBBRU5UUjElMEFEVVNQMTUlMEFCQ0w5JTBBQ1RQUzIlMEFTRlJQMSUwQU5QSVBCMyUwQUNOVE5BUDElMEFBUkZHQVAyJTBBUEdCRDElMEFSQVNBTDIlMEFFRk5CMyUwQUFTTVRMJTBBTlBJUEIxMiUwQUZPWEcxJTBBVFRDMjFCJTBBRkxZV0NIMSUwQVRHTTElMEFaRllWRTI4JTBBUENOWDMlMEFHQUxOVDE3JTBBS0FaTiUwQVBNRjElMEFCTVA0JTBBQU5LSEQxJTBBUklNUzElMEFFUlZXLTElMEFVQlFMTjQlMEFBQkNGMSUwQVpORjU5MiUwQUM2b3JmMTQxJTBBTUVTUDElMEFOVURUMTglMEFNQU4yQzElMEFFUk8xQSUwQVBPVTZGMSUwQUFSTDRDJTBBUkFQMkMlMEFDQ05FMSUwQUNQU0YxJTBBWlNDQU4yNSUwQU1FVEFQMUQlMEFSTkYxNTIlMEFDQ0RDMTU3JTBBQ0xWUzElMEFUTE5SRDElMEFIRVkyJTBBUkhPVDIlMEFNRUQxNSUwQUJDQVQxJTBBRlJNUEQxJTBBUklQT1IzJTBBSFNQQTFCJTBBUENESEIxMCUwQU5QSFMxJTBBUE5QTEExJTBBUkFCNDBDJTBBUFVSQSUwQUxHQUxTOSUwQUROTVQzQiUwQU5UNUMyJTBBTkFMRjIlMEFDREsxMUElMEFDUEVCMSUwQURJQ0VSMSUwQVZTSUcxMEwyJTBBTFJQNCUwQVNIM0QyMSUwQSZvcmRlcmVkPWZhbHNlJmFsbF9yZXN1bHRzPWZhbHNlJm5vX2llYT1mYWxzZSZjb21iaW5lZD10cnVlJm1lYXN1cmVfdW5kZXJyZXByZXNlbnRhdGlvbj1mYWxzZSZkb21haW5fc2NvcGU9YW5ub3RhdGVkJnNpZ25pZmljYW5jZV90aHJlc2hvbGRfbWV0aG9kPWZhbHNlX2Rpc2NvdmVyeV9yYXRlJnVzZXJfdGhyZXNob2xkPTAuMDUmbnVtZXJpY19uYW1lc3BhY2U9RU5UUkVaR0VORV9BQ0Mmc291cmNlcz1HTzpNRixHTzpDQyxHTzpCUCxLRUdHLFJFQUMsSFBBLENPUlVNLEhQLFdQJmJhY2tncm91bmQ9Jm5vX2V2aWRlbmNlcz1mYWxzZSkpIHdoaWNoIHNob3dzIG15IHF1ZXJ5IGZvciB0aGUgZW50aXJlIG9yZGVyZWQgZ2VuZSBsaXN0LiBXaGljaCBsb29rcyBhbG1vc3QgaWRlbnRpY2FsLCBpbiB0ZXJtcyBvZiBzcHJlYWQsIGFuZCBoaXRzLiBUaGUgc2V0dGluZ3MgYW5kIHF1ZXJ5IGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGVpciByZXNwZWN0aXZlIHRhYnMgYnkgZm9sbG93aW5nIHRoaXMgbGluay4gVGhpcyBsaW5rIGlzIGZvciByZWZlcmVuY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IHdoYXQgSSBhbSBkb2luZyBpcyBsb2dpY2FsLiAKCgoKCiMjIyBnOnByb2ZpbGVyIGZvciBPUkEgZGlmZmVyZW50dWFsbHkgdXAgcmVndWxhdGVkIGV4cHJlc3NlZCBnZW5lczoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5jYXA9IkZpZ3VyZSA2QjogTWFuaGF0dGFuIFBsb3Qgb2YgT1JBIHJlc3VsdHMgZm9yIGFsbCB1cC1yZWd1bGF0ZWQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIn0KZ29zdHJlc3RwMVVwIDwtIGdvc3QoYWxsX3VwLCBzb3VyY2VzPWMoIkdPOkJQIiwgIkdPOk1GIiwgIkdPOkNDIiwgIktFR0ciLCAiSFBBIiwgIkhQIiwgIlJFQUMiKSkKZ29zdHBsb3QoZ29zdHJlc3RwMVVwLCBjYXBwZWQgPSBGQUxTRSwgaW50ZXJhY3RpdmUgPSBUUlVFKQpgYGAKClxuZXdsaW5lIEZpZ3VyZSA2QiBpcyBhIE1hbmhhdHRhbiBQbG90IHdoYXQgc2hvd3MgdGhlIGhpdHMgYW5kIGdlbmVzIGZyb20gdGhlIGRpZmZlcmVudCBhbm5vdGF0aW9uIGRhdGFiYXNlcy4gVGhpcyBpbmNsdWRlcyBvbmx5IHVwcmVndWxhdGVkIGdlbmVzIGZvciB0aGlzIGRhdGFzZXQuIFRoZSBvbmx5IGhpcyB3ZSBnZXQgYmFjayBhcmUgZnJvbSBHTzpNRiBhbmQgR086Q0MgYW5ub3RhdGlvbiBkYXRhYmFzZXMuIFdoZW4gbG9va2luZyB1cCB0aGUgZ2VuZSBbaE1ULUNPMV0oaHR0cHM6Ly93d3cudW5pcHJvdC5vcmcvdW5pcHJvdC9QMDAzOTUpIG9uIHVuaXByb3Qgd2UgY2FuIHNlZSB1bmRlciB0aGUgRnVuY3Rpb25zIGhlYWRpbmcgYW5kIHRoZSBHTyBzdWJoZWFkaW5ncyB0aGF0IGl0IGluZGVlZCBpcyBhIGdlbmUgdGhhdCBlbmNvZGVzIGZvciBhIHN0cnVjdHVyZSB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBtb2xlY3VsYXIgYW5kIGlzIGluZGVlZCBhIGNlbGx1bGFyIGNvbXBvbmVudCBzaW5jZSBpdCBpcyBmb3VuZCBpbiB0aGUgbWl0b2Nob25kcmlhLiBXaGljaCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHJlc3VsdCB0aGF0IEkgZ290IHJ1bm5pbmcgdGhpcyBpbnB1dCBvbiBbZ3Byb2ZpbGVyXSgoaHR0cHM6Ly9iaWl0LmNzLnV0LmVlL2dwcm9maWxlci9nb3N0P29yZ2FuaXNtPWhzYXBpZW5zJnF1ZXJ5PUhBREhCJTBBU0NBUEVSJTBBUFVNMSUwQUNFUDQxJTBBUENHRjUlMEFQUFAxUjIxJTBBSUdGQlA2JTBBSE1HWEI0JTBBUERMSU03JTBBQlJEVCUwQUNMQ040JTBBRVBEUjElMEFIMkJDNSUwQUNSRUcyJTBBR1BYNCUwQVpORjEyJTBBQVJMOEIlMEFSSU1LTEElMEFSRUVQMSUwQUZLQlAxNSUwQUZBTTExN0IlMEFNT1hEMSUwQVBMRUtIRDElMEFUT1IzQSUwQVJBRFglMEFQWU0xJTBBS0lBQTAxMDAlMEFTVEFNQlAlMEFOTEdONFklMEFTTEM0QTclMEFDT0wyM0ExJTBBU1QxMyUwQUVETlJBJTBBTkxHTjRYJTBBRFNUTiUwQU1NQUNIQyUwQU5DT0ExJTBBRUxNT0QxJTBBUkNBTjMlMEFLQ1REMiUwQUxZUk03JTBBVU5DMTE5JTBBUFJORCUwQUxSUkMxNSUwQVBTRDMlMEFMUkJBJTBBRkJYTDE0JTBBQ0VQMTklMEFITlJOUFIlMEFBQkhEMTElMEFBQ1RSMiUwQU5SQVAlMEFVQ0tMMSUwQUlURkcxJTBBQ01QSzIlMEFEVVNQMTIlMEFaTkY0MjUlMEFVQkUyRDElMEFVQkE1JTBBRVJCQjMlMEFJUE81JTBBVE05U0YzJTBBTlBBUzMlMEFITEEtRFBBMSUwQUdTVEE0JTBBQ0NSOSUwQVJBU1NGMiUwQVBIS0cxJTBBU01PQzIlMEFTS0EyJTBBQ1ROTkEzJTBBUlBTQSUwQUFUUDVGMUIlMEFSR01BJTBBS0xIREMxJTBBU0NBUkIyJTBBUFJLREMlMEFDT0JMJTBBTUVEMTNMJTBBSVpVTU80JTBBWlVQMSUwQUEyTSUwQVRNRU0yNDElMEFQQVJQNCUwQUdPTE0xJTBBS0lGMTUlMEFQQ1lUMUIlMEFUWVJPMyUwQVBFQTE1JTBBTElQSCUwQUNOVE42JTBBTUxMVDMlMEFURVg1MiUwQVVCQUxEMiUwQUNITVA1JTBBWkJUQjQwJTBBR0dIJTBBUEdNMkwxJTBBU1VHVDElMEFISEFUTCUwQUVMQVBPUjIlMEFMWVJNMiUwQVBPTEEyJTBBSUZOQVIxJTBBS0NOSjUlMEFTSDJENEElMEFMUENBVDIlMEFaTkY3MzAlMEFOVUNCMiUwQURVU1A4JTBBS1JUQ0FQMiUwQU9MRk0zJTBBV0lQRjIlMEFQUlNTMjMlMEFETEMxJTBBRERYMzElMEFFSTI0JTBBR01QUiUwQUxZNkglMEFOQ0FQSDIlMEFaTkY5OSUwQUZSRzElMEFaTkY3NDAlMEFMUk1EQSUwQVdEUjQlMEFUUklNMTZMJTBBR0lOUzElMEFOWFBFMSUwQUdBQlJQJTBBQVBCQjFJUCUwQUpBS01JUDElMEFERU5ORDZCJTBBQ09YN0MlMEFTSDNSRjIlMEFDSUIyJTBBVEhOU0wyJTBBTkNPQTMlMEFFU0FNJTBBQ0RSVDElMEFDQldENSUwQVNFUlBJTkI4JTBBRkdGMSUwQU5UQVExJTBBQ0VSUzIlMEFOT1g0JTBBU0xDOUEyJTBBWk5GMjg2QSUwQVJQUzE1QSUwQUdTTiUwQUtMSEwzOCUwQUhST0IlMEFHSVBDMyUwQU1PSyUwQUhFWElNMiUwQVpORjEwNiUwQUxPWEw0JTBBT0xGTTQlMEFUTUVNMTI4JTBBUFJYTDJBJTBBU1RUM0ElMEFBREdSRTElMEFTTlgyOSUwQVNFTUE0RiUwQU9SOVExJTBBWUlQRjQlMEFQVEsyQiUwQURQWVNMMyUwQUVGTkIxJTBBQ0QzNCUwQUNEMzMlMEFEVEwlMEFCQUNFMiUwQU9TQ0FSJTBBVE1FTTE0NCUwQUdURjJIMyUwQUZaRDYlMEFHVFBCUDglMEFQSUdBJTBBWk5GNTUwJTBBU0FWMSUwQUNVTDRBJTBBQ0VMQTNCJTBBQUZBUDFMMSUwQVBJSzNDMkclMEFQWFQxJTBBVFJNVDJCJTBBU1RBUkQ0JTBBTElMUkExJTBBQ0xOMyUwQVNMQzhBMSUwQUFUUDJCNCUwQUZGQVI0JTBBVUJBMiUwQUlOQ0ExJTBBV05UOEIlMEFSTkY0JTBBTFJSQzYzJTBBVE1FTTlCJTBBU1NUJTBBWk5GNDI2JTBBTFJSQzc0QiUwQUVYUEg1JTBBRUZIQiUwQVRBREEyQSUwQUNBTVNBUDIlMEFNQVJGMSUwQVRUTEw0JTBBT1IyVzMlMEFOUlNOMSUwQUFSUFAyMSUwQVdEUjUzJTBBQ0QxMDklMEFQSVRIRDElMEFHUlBFTDIlMEFHVEYzQzElMEFJTlRTOSUwQVRNUFJTUzExRCUwQVRNRU0xODIlMEFTVUxUMUIxJTBBQ0NSMyUwQUVOQUglMEFQVERTUzElMEFETkFBRjExJTBBSExDUyUwQUNMUFRNMSUwQU1FR0Y5JTBBVFBSS0IlMEFTQU1ENEElMEFIRVhCJTBBUENESEI4JTBBTVJFRyUwQUVSTEVDMSUwQU9UVUQ0JTBBWk5GNDMwJTBBU1JQOSUwQVpORjIyMSUwQUNDVDIlMEFIREhEMyUwQUdQUjg0JTBBVE0yRDElMEFJRlQxNzIlMEFTUEFHMSUwQUNMVEMlMEFDRkhSNCUwQUJPUkNTNiUwQUxJTUQyJTBBTlVEVDE0JTBBQ0RIOCUwQUdQUjEwOCUwQUJSRjIlMEFXTks0JTBBREVQVE9SJTBBVE1FTTEwOCUwQUVQUzhMMSUwQVREUkQxMiUwQUNNVFIxJTBBRE5NMyUwQU1ULUNPMSUwQU9TQlBMOSUwQUhBWDElMEFOT1AxMCUwQUFJUCUwQUdQQVRDSDIlMEFIQ04xJTBBTVNSMSUwQVRNRU0xMjZCJTBBU0xDMTlBMyUwQUxTTTE0QiUwQVpCVEIyNSUwQUVSVlYtMSUwQU5PTU8yJTBBUEFSRyUwQVJBQjZDJTBBQUFSU0QxJTBBQ0RIMTMlMEFTRUxFTkJQMSUwQUFCSEQxNEElMEFBTERIM0IxJTBBR0NNMiUwQUVMUDMmb3JkZXJlZD10cnVlJmFsbF9yZXN1bHRzPWZhbHNlJm5vX2llYT1mYWxzZSZjb21iaW5lZD1mYWxzZSZtZWFzdXJlX3VuZGVycmVwcmVzZW50YXRpb249ZmFsc2UmZG9tYWluX3Njb3BlPWFubm90YXRlZCZzaWduaWZpY2FuY2VfdGhyZXNob2xkX21ldGhvZD1mYWxzZV9kaXNjb3ZlcnlfcmF0ZSZ1c2VyX3RocmVzaG9sZD0wLjA1Jm51bWVyaWNfbmFtZXNwYWNlPUVOVFJFWkdFTkVfQUNDJnNvdXJjZXM9R086TUYsR086Q0MsR086QlAsS0VHRyxSRUFDLEhQQSxDT1JVTSxIUCxXUCZiYWNrZ3JvdW5kPSZub19ldmlkZW5jZXM9ZmFsc2UpCikgd2l0aCB0aGUgc2V0dGluZ3MgYW5kIGlkZWFzIGZyb20gbGVjdHVyZS4gVGhlc2UgY2FuIGJlIGZvdW5kIGJ5IG5hdmlnYXRpbmcgdG8gdGhlICJRdWVyeSBJbmZvIHRhYiIuIFRoaXMgbGluayBpcyBmb3IgcmVmZXJlbmNlcyB0byBtYWtlIHN1cmUgdGhhdCB3aGF0IEkgYW0gZG9pbmcgaXMgbG9naWNhbC4gCgojIyMgZzpwcm9maWxlciBmb3IgT1JBIGRpZmZlcmVudHVhbGx5IGRvd24gcmVndWxhdGVkIGV4cHJlc3NlZCBnZW5lczoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5jYXA9IkZpZ3VyZSA2QTogTWFuaGF0dGFuIFBsb3Qgb2YgT1JBIHJlc3VsdHMgZm9yIGFsbCBkb3duLXJlZ3VsYXRlZCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMifQpnb3N0cmVzdHAxRG93biA8LSBnb3N0KGFsbF9kb3duLCBzb3VyY2VzPWMoIkdPOkJQIiwgIkdPOk1GIiwgIkdPOkNDIiwgIktFR0ciLCAiSFBBIiwgIkhQIiwgIlJFQUMiKSkKZ29zdHBsb3QoZ29zdHJlc3RwMURvd24sIGNhcHBlZCA9IEZBTFNFLCBpbnRlcmFjdGl2ZSA9IFRSVUUpCmBgYApcbmV3bGluZSBGaWd1cmUgNkMgaXMgYSBNYW5oYXR0YW4gUGxvdCB3aGF0IHNob3dzIHRoZSBoaXRzIGFuZCBnZW5lcyBmcm9tIHRoZSBkaWZmZXJlbnQgYW5ub3RhdGlvbiBkYXRhYmFzZXMuIFRoaXMgaW5jbHVkZXMgb25seSBkb3ducmVndWxhdGVkIGdlbmVzIGZvciB0aGlzIGRhdGFzZXQuIEhlcmUgd2UgY2FuIHNlZSBhIGxhcmdlIG51bWJlciBvZiB0aGUgaGl0cyBmcm9tIEhQQSwgR086QlAsIEdPOkNDLiBHTzpNRi4gVGhpcyBhbHNvIGhhcyBhIHNpbWlsYXIgZGF0YWJhc2Ugc3ByZWFkLCBhbHRob3VnaCB0aGUgbnVtYmVyIG9mIGhpdHMgaXMgbm90IHRoZSBzYW1lLCB0aGUgZ29wcm9maWxlciB3ZWJzaXRlIGhhZCBkaWZmZXJlbnQgb3B0aW9ucywgd2UgYXJlIG9ubHkgdXNpbmcgdGhlIGdlbmVzIG9mIGludGVyZXN0LiBUaGV5IGFyZSB1c2luZyB0aGUgZW50aXJlIG5lZ2F0aXZlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBsaXN0LiBUaGUgcXVlcnkgY2FuIGJlIGZvdW5kIFtoZXJlXSgoaHR0cHM6Ly9iaWl0LmNzLnV0LmVlL2dwcm9maWxlci9nb3N0P29yZ2FuaXNtPWhzYXBpZW5zJnF1ZXJ5PUdBUzYlMEFDQ0RDOTMlMEFNRVRSTiUwQVRBRjElMEFXSUYxJTBBR0FLJTBBUExFS0hPMSUwQVNOUlBCJTBBTUFQSzQlMEFQQUNTSU4yJTBBTVlPOUIlMEFDQUNOQjQlMEFaTkY1MTJCJTBBTVJQUzIlMEFBREFNMjAlMEFFQkY0JTBBUE9MUjJNJTBBWkZIWDIlMEFSQVNBNEIlMEFNSUIyJTBBRVZBMUMlMEFTTlBIJTBBVENGMjAlMEFQSUVaTzElMEFOVURUMTMlMEFBTktSRDI5JTBBTlBBUzIlMEFETkFBRjUlMEFTRUMxNkElMEFGQVJQMSUwQUFURjQlMEFQQ05UJTBBS01UMkElMEFGQlhPMjElMEFPUkFJMiUwQUNIQUYxQSUwQU1FRjJEJTBBRUlEMyUwQUFER1JHMSUwQU5PTDQlMEFBUkYxJTBBUFJPWiUwQVBIUkYxJTBBUlhSQSUwQUNBUE4xMiUwQUFURzRCJTBBUkNDMiUwQUFHTzIlMEFSSU1LTEIlMEFDQU1TQVAxJTBBSFlBTDElMEFDREsxMUIlMEFGQU0yMTlBJTBBQ1lUSDIlMEFGTkRDM0ElMEFDRU5BVEFDJTBBTVRTUzIlMEFSQkJQNyUwQUNEQzI1QiUwQUFOS1JEMzklMEFNQVBSRTMlMEFOQ0xOJTBBRUhCUDFMMSUwQVJBQjExRklQNCUwQU1SUEw0NSUwQVJNTkQ1QSUwQUFMWVJFRiUwQU1JRDFJUDElMEFTUlAxNCUwQVBOUExBNyUwQUdJRDglMEFCQ0wxMUIlMEFSTkYxODclMEFLQ05OMiUwQUFLVDIlMEFUTUVNMTIxJTBBTUNGMkwyJTBBTUFNREM0JTBBU01JTTMyJTBBRkdGMjIlMEFTUEFUQTEzJTBBU0xDMjJBMjMlMEFUUlJBUCUwQVJCTTI4JTBBU1RNTjMlMEFCTVMxJTBBQklDREwxJTBBSElWRVAyJTBBUExLNSUwQVRHRkJSQVAxJTBBREFaQVAxJTBBQ0FNS0sxJTBBUExJTjUlMEFUUkFQUEM5JTBBVVRQMjAlMEFJVFBSSVBMMiUwQURJUDJDJTBBQ0NEQzEzNCUwQVNFTEVOT08lMEFNTUFBJTBBU0NBUkYyJTBBQVNQSEQxJTBBWk5GMzE4JTBBQzE3b3JmNTglMEFQUE9YJTBBUFBQMVIxMCUwQVpORjQ5NyUwQUZCWEw2JTBBWk5GNzElMEFOQUExNiUwQUFCQ0MxMCUwQVNOWDMzJTBBUEdMWVJQMSUwQUFVVFMyJTBBVE1VQjIlMEFTUDMlMEFUTUVEOCUwQVFLSSUwQUNIU1Q3JTBBRlhZRDIlMEFLSUFBMDkzMCUwQUJBSENDMSUwQU1BU1QxJTBBTkFDQzElMEFDTElQMiUwQUNTTksxRCUwQVlXSEFRJTBBTkVUTzElMEFDTEFTUDElMEFJUVNFQzElMEFIUzZTVDElMEFEQ0hTMSUwQUNFTlBLJTBBRVhPU0MzJTBBU1RVQjElMEFDREtOMUElMEFMQVQlMEFTTlJOUDI1JTBBVTJBRjIlMEFSQVNHRUYxQyUwQUJBSUFQMkwyJTBBUERFMkElMEFTTkFJMyUwQVNHU00zJTBBSUwzMVJBJTBBRkFNMjIyQSUwQVRVQkIyQiUwQUNDREM4NUElMEFTSElTQTclMEFXRFI4OSUwQVNJR0lSUiUwQVBERTVBJTBBUENESEE4JTBBU0RGMkwxJTBBT0dESEwlMEFDSFJOQTQlMEFOUFIyJTBBQkNBVDIlMEFZSkVGTjMlMEFSSENHJTBBUFNNQzNJUCUwQUFMREg4QTElMEFTUEFDQTYlMEFBTEtCSDQlMEFNWFJBNyUwQVNJR0xFQzElMEFDWVAySjIlMEFBREQzJTBBUERaRDQlMEFDQUNOQTFCJTBBTUFJUDElMEFTTEFJTjElMEFTTEMyNUE1MyUwQVJDRTElMEFETkFJMSUwQUFSSEdFRjEwTCUwQVNGM0I0JTBBSVRHQjElMEFQU01ENSUwQU1QUDIlMEFTVVBUNUglMEFBREdSQTElMEFGQU0xNTZCJTBBVEFTMVIzJTBBU05DQiUwQUZPWEsxJTBBVFlXMUIlMEFUTTlTRjElMEFNQUQyTDIlMEFQRVgyNiUwQVNMQzEyQTIlMEFUWU1QJTBBWkMzSDQlMEFUTUVNMTgxJTBBS1JUMjMlMEFNREdBMiUwQVNFVEQxQiUwQUdQQlAxTDElMEFEUFlEJTBBRkJYVzklMEFFUEhYNCUwQU5FTEZFJTBBRkFBSCUwQU5VTUJMJTBBU1RBUkQ3JTBBUkFCMzYlMEFSQk1TMSUwQU5HUk4lMEFOQURTWU4xJTBBQ1lQMkI2JTBBUEhZSCUwQVlZMUFQMSUwQVJUTDElMEFHQUJSQjElMEFMRU5HMSUwQVBSS1JJUDElMEFOT1ZBMiUwQVBIWUtQTCUwQVNSRUJGMSUwQUxJWDElMEFDM29yZjQ5JTBBUEhZSElQJTBBU0VMRU5PSyUwQVNBTUQ0QiUwQUc2UEQlMEFOQVJTMiUwQUNSRUxEMSUwQUFURzE0JTBBTkFUMTYlMEFDMTFvcmY3MSUwQUxQQSUwQUNBQ05BMUklMEFUTUNDMSUwQVBVUkIlMEFDRVAzNTAlMEFETEczJTBBTkFWMSUwQUNESzEwJTBBQ0FQTjIlMEFNVUNMMSUwQVNQVEIlMEFLSFNSUCUwQUM3b3JmNTAlMEFIR0gxJTBBUFJSNyUwQU5BVDhMJTBBVE5SQzZDJTBBWkMzSDdCJTBBQ0ZBUDkxJTBBTVlMNiUwQVRBUlMyJTBBQVJIR0RJQSUwQVNOUk5QMjAwJTBBUElUUE5NMyUwQUlMNSUwQU9TQlBMMiUwQUxBVFMxJTBBTlBEQzElMEFQS0RDQyUwQVBMQTJHNEQlMEFDUEVEMSUwQUVOVFIxJTBBRFVTUDE1JTBBQkNMOSUwQUNUUFMyJTBBU0ZSUDElMEFOUElQQjMlMEFDTlROQVAxJTBBQVJGR0FQMiUwQVBHQkQxJTBBUkFTQUwyJTBBRUZOQjMlMEFBU01UTCUwQU5QSVBCMTIlMEFGT1hHMSUwQVRUQzIxQiUwQUZMWVdDSDElMEFUR00xJTBBWkZZVkUyOCUwQVBDTlgzJTBBR0FMTlQxNyUwQUtBWk4lMEFQTUYxJTBBQk1QNCUwQUFOS0hEMSUwQVJJTVMxJTBBRVJWVy0xJTBBVUJRTE40JTBBQUJDRjElMEFaTkY1OTIlMEFDNm9yZjE0MSUwQU1FU1AxJTBBTlVEVDE4JTBBTUFOMkMxJTBBRVJPMUElMEFQT1U2RjElMEFBUkw0QyUwQVJBUDJDJTBBQ0NORTElMEFDUFNGMSUwQVpTQ0FOMjUlMEFNRVRBUDFEJTBBUk5GMTUyJTBBQ0NEQzE1NyUwQUNMVlMxJTBBVExOUkQxJTBBSEVZMiUwQVJIT1QyJTBBTUVEMTUlMEFCQ0FUMSUwQUZSTVBEMSUwQVJJUE9SMyUwQUhTUEExQiUwQVBDREhCMTAlMEFOUEhTMSUwQVBOUExBMSUwQVJBQjQwQyUwQVBVUkElMEFMR0FMUzklMEFETk1UM0IlMEFOVDVDMiUwQU5BTEYyJTBBQ0RLMTFBJTBBQ1BFQjElMEFESUNFUjElMEFWU0lHMTBMMiUwQUxSUDQlMEFTSDNEMjElMEEmb3JkZXJlZD10cnVlJmFsbF9yZXN1bHRzPWZhbHNlJm5vX2llYT1mYWxzZSZjb21iaW5lZD1mYWxzZSZtZWFzdXJlX3VuZGVycmVwcmVzZW50YXRpb249ZmFsc2UmZG9tYWluX3Njb3BlPWFubm90YXRlZCZzaWduaWZpY2FuY2VfdGhyZXNob2xkX21ldGhvZD1mYWxzZV9kaXNjb3ZlcnlfcmF0ZSZ1c2VyX3RocmVzaG9sZD0wLjA1Jm51bWVyaWNfbmFtZXNwYWNlPUVOVFJFWkdFTkVfQUNDJnNvdXJjZXM9R086TUYsR086Q0MsR086QlAsS0VHRyxSRUFDLEhQQSxDT1JVTSxIUCxXUCZiYWNrZ3JvdW5kPSZub19ldmlkZW5jZXM9ZmFsc2UpKSBUaGUgc2V0dGluZ3MgYW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBxdWVyeSBjYW4gYmUgZm91bmQgYnkgbmF2aWdhdGluZyB0byB0aGUgIlF1ZXJ5IGluZm8iIHRhYi4gCgoKIyMgQW5zd2VycyB0byBRdWVzdGlvbnMgCldpdGggeW91ciBzaWduaWZpY2FudGx5IHVwLXJlZ3VsYXRlZCBhbmQgZG93bi1yZWd1bGF0ZWQgc2V0IG9mIGdlbmVzIHJ1biBhIHRocmVzaG9sZGVkIGdlbmUgc2V0IGVucmljaG1lbnQgYW5hbHlzaXM6CgoxLiBXaGljaCBtZXRob2QgZGlkIHlvdSBjaG9vc2UgYW5kIHdoeT8gCkkgY2hvc2UgdG8gdXNlIE92ZXItUmVwcmVzZW50YXRpb24gQW5hbHlzaXMgKE9SQSkuIEkgYW0gdXNpbmcgdGhpcyBtZXRob2QgYmVjYXVzZSBpdCBpcyB0aGUgb25lIEkgbW9zdCBmYW1pbGlhciB3aXRoIGZvciB0aGUgZ2VuZSBzZXQgZW5yaWNobWVudCBhbmFseXNpcy4gSXQgaXMgb25lIG9mIHRoZSBtb3N0IHdpZGVseSB1c2VkIGFuZCBzaW1wbGUgKEh1YW5nIGV0IGFsLiwgMjAwOSkuIEZvciB0aGlzIGFzc2lnbm1lbnQgYW5kIG15IE9SQXMsIEkgY2hvc2UgdG8gdXNlIHRoZSBncHJvZmlsZXIyIFIgcGFja2FnZS4gSSBmb3VuZCBnOlByb2ZpbGVyIHZlcnkgY29udmVuaWVudCB0byB1c2UgYW5kIHdhcyBzb21ld2hhdCBmYW1pbGlhciB3aXRoIGl0IGZyb20gQkNINDQxLiBBbHNvIGc6cHJvZmlsZXIgaXMgZXh0cmVtZWx5IHJvYnVzdCBhbmQgdGhvcm91Z2gsIGl0IGFsbG93cyB5b3UgdG8gYmUgdmVyeSBjcmVhdGl2ZSBpbiBob3cgeW91IGNob29zZSB5b3VyIHZhbHVlcywgb3Igd2hhdGV2ZXIgZWxzZSB5b3UgbmVlZC4gQWRkaXRpb25hbGx5LCBJIHVzZWQgaXQgZHVyaW5nIG15IGxhc3QgYXNzaWdubWVudCBhbmQgZm9yIHBsb3R0aW5nIGl0IHNlZW1zIHRvIGJlIHRoZSBtb3N0IHdpZGVseSB1c2VkIGFuZCByZWNvbW1lbmRlZC4gT25lIG9mIHRoZSBiZXN0IGZlYXR1cmVzIGluIG15IG9waW5pb24gaXMgdG8gcXVpY2tseSBhbmQgZWFzaWx5IGNvbXBhcmUgYSBudW1iZXIgb2YgZ2VuZXMgdG8gYSBudW1iZXIgb2YgZGlmZmVyZW50IGRhdGFiYXNlcyBpbiBvbmUgZXhwcmVzc2lvbi9saW5lIG9mIGNvZGUuIFRoZXJlIGFyZSBhbHNvIG90aGVyIGN1c3RvbWl6YXRpb24gdGhhdCB5b3UgY2FuIGRvIHJlZ2FyZGluZyB0aGUgcGxvdHMgeW91IG1ha2UgYXMgd2VsbC4gCgoyLiBhKSBXaGF0IGFubm90YXRpb24gZGF0YSBkaWQgeW91IHVzZSBhbmQgd2h5PyBiKSBXaGF0IHZlcnNpb24gb2YgdGhlIGFubm90YXRpb24gYXJlIHlvdSB1c2luZz8gXG5ld2xpbmUKYSkgVGhlIGFubm90YXRpb24gc291cmNlcyB1c2VkIGZvciB0aGlzIGFuYWx5c2lzIG9mIHRoaXMgZGF0YXNldCBpbiB0aGlzIGFzc2lnbm1lbnQgYXJlIGFzIGZvbGxvd3M7IEdPOiBNb2xlY3VsYXIgRnVuY3Rpb25zLCBHTzogQ2VsbHVsYXIgQ29tcG9uZW50cywgR086IEJpb2xvZ2ljYWwgUGF0aHdheXMsIGFuZCBLRUdHLCBIUEEgKyBIUCAoSHVtYW4gUHJvdGVhbiBBdGxhcykuIApBbGwgb2YgdGhlIGRhdGEgdGhhdCB3YXMgYWNxdWlyZWQgd2FzIGZyb20gaHVtYW4gY2VsbHMsIHNvIGl0IG1ha2VzIHNlbnNlIHRoYXQgdGhlIHNvdXJjZXMgd291bGQgYWxzbyByZWZlcmVuY2UgYW5kIGJlIGh1bWFuLCBtYWlubHkgdGhlIEhQQSBkYXRhYmFzZSwgc2luY2UgYSB2YXN0IG1ham9yaXR5IG9mIHRoZSBjZWxscyBhcmUgaHVtYW4gcHJvdGVpbnMuIFRoZSBvdGhlciBoaXRzIG9uIHRoZSBvdGhlciBkYXRhYmFzZXMgYWxzbyBtYWtlIHNlbnNlIGFzIGluIHRoZSBleHBlcmltZW50IGFzIHRoZSBhdXRob3JzIHdlcmUgbG9va2luZyBhdCBjZWxscyB0aGF0IGFyZSByZWxhdGVkIHRvIGZ1bmN0aW9uIGFuZCBpbmhpYml0aW9uIG9mIGRpZmZlcmVudCBtb2xlY3VsYXIgc3RydWN0dXJlcywgY2VsbHVsYXIgY29tcG9uZW50cyBhbmQgYmlvbG9naWNhbGwgcGF0aHdheXMgYXMgdGhlIGFmZmVjdGVkIGNlbGxzIGJlaGF2ZSBkaWZmZXJlbnQgZnJvbSBub3JtYWwgY2VsbHMuIEFkZGlvbnRpb25hbGx5LCBhIGxvdCBvZiB0aGUgYW5ub3RhdGlvbiBkYXRhIHdhcyBtZW50aW9uZWQgaW4gdGhlIHBhcGVyIGJ5IHRoZSBhdXRob3JzLCBmb3IgZXhhbXBsZSBHTzpCUCwgYW5kIEdPOk1GLiBcbmV3bGluZQpiKSBUaGUgdmVyc2lvbiBvZiBhbm5vdGF0aW9uIGRhdGEgaXMgYXNzb2NpYXRlZCBhbmQgdXBkYXRlZCBiYXNlZCBvbiBnOlByb2ZpbGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBncHJvZmlsZXIyIHBhY2thZ2UgdmVyc2lvbiBiZWluZyAwLjIuMS4gVGhpcyBpcyB0aGUgdmVyc2lvbiB0aGF0IEkgYW0gdXNpbmcuIFlvdSBjYW4gdmVyaWZ5IHRoaXMgYnkgbG9va2luZyBhdCB0aGUgcGFja2FnZXMgdGFiIGFuZCBzY3JvbGxpbmcgb3Igc2VhcmNoaW5nIGZvciBncHJvZmlsZXIyIGFuZCBsb29raW5nIGZvciB0aGUgdmVyc2lvbiBudW1iZXIuIAoKMy4gYSkgSG93IG1hbnkgZ2VuZXNldHMgd2VyZSByZXR1cm5lZCB3aXRoIHdoYXQgdGhyZXNob2xkcz8gVGhlIG9yZGVyIG9mIHRoZXNlIGFuc3dlcnMgd2lsbCBjb2luY2lkZSB3aXRoIHRoZSBvcmRlciBvZiB0aGUgcGxvdHMgZm9yIGNvbnNpc3RlbmN5IHNha2UuIFxuZXdsaW5lIAppKSBUaGUgbnVtYmVyIGZvciBhbGwgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzOiBgciBsZW5ndGgoYWxsdmFsdWVzKWAgLiBcbmV3bGluZSAKaWkpIFRoZSBudW1iZXIgZm9yIGFsbCBkaWZmZXJlbnRpYWxseSB1cHJlZ3VsYXRlZCBnZW5lczogYHIgbGVuZ3RoKGFsbF91cF9lbnMpYCAuIFxuZXdsaW5lCmlpaSkgVGhlIG51bWJlciBmb3IgYWxsIGRpZmZlcmVudGlhbGx5IGRvd25yZWd1bGF0ZWQgZ2VuZXM6IGByIGxlbmd0aChhbGxfZG93bl9lbnNnKWAgLiBcbmV3bGluZQpcbmV3bGluZSBUaGUgdGhyZXNob2xkcyBmb3IgYWxsIHRoZXNlIHdhcyB0aGUgc2FtZSB2YWx1ZSB0aGF0IEkgdXNlZCBpbiBteSBlbnRpcmUgYXNzaWdubWVudCwgYSBQLVZhbHVlIDwgMC4wNSwgdGhpcyBhbGxvd2VkIGZvciBnZW5lcyB0aGF0IGhhZCBhIHN0cm9uZyBjb3JyZWxhdGlvbiB3aXRoIHRoZSBleHBlcmltZW50IHRvIGJlIHNlbGVjdGVkIGFuZCBmdXJ0aGVyIHByb2Nlc3NlZC4gCgo0LiBSdW4gdGhlIGFuYWx5c2lzIHVzaW5nIHRoZSB1cC1yZWd1bGF0ZWQgc2V0IG9mIGdlbmVzLCBhbmQgdGhlIGRvd24tcmVndWxhdGVkIHNldCBvZiBnZW5lcyBzZXBhcmF0ZWx5LiBIb3cgZG8gdGhlc2UgcmVzdWx0cyBjb21wYXJlIHRvIHVzaW5nIHRoZSB3aG9sZSBsaXN0IChpLmUgYWxsIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyB0b2dldGhlciB2cy4gdGhlIHVwLXJlZ3VsYXRlZCBhbmQgZG93biByZWd1bGF0ZWQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIHNlcGFyYXRlbHkpPyBcbmV3bGluZQpJbiB0aGUgYW5hbHlzaXMgb2YganVzdCB0aGUgdXAtcmVndWxhdGVkIHNldCBvZiBnZW5lcywgMiBnZW5lcGF0aHdheXMgd2VyZSBwbG90dGVkLCBidXQgSSBoYWQgNTYwIHVwcmVndWxhdGVkIGdlbmVzLiBPbmUgd2FzIGZyb20gR086TUYgYW5kIHRoZSBvdGhlciB3YXMgZnJvbSBHTzpDQy4gRm9yIHRoZSBkb3duLXJlZ3VsYXRlZCBnZW5lcywgdGhlcmUgd2VyZSAzMjggZ2VuZXNldHMgcmV0dXJuZWQuIEkgaGFkIGdlbmVzZXRzIGZyb207IEdPOk1GLCBHTzpDQywgR086QlAsIGFuZCBhIGZldyBiZXR3ZWVuIEhQQSBhbmQgSFAuIEZvciBhbGwgdGhlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcywgSSBoYWQgZ2VuZXNldHMgZnJvbTsgR086TUYsIEdPOkNDLCBHTzpCUCwgYXMgd2VsbCBhcyBzb21lIHBsb3R0ZWQgYmV0d2VlbiBIUEEgYW5kIEhQLiBXaGljaCBtYWtlcyBzZW5zZSBhcyBpZiBJIGFtIHVzaW5nIHRoZSBmdWxsIGxpc3QgZm9yIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcywgSSBzaG91bGQgaGF2ZSByZXN1bHRzIHRoYXQgZW50YWlsIGJvdGggdGhlIHVwcmVndWxhdGVkIGFuZCBkb3duIHJlZ3VsYXRlZCBnZW5lc2V0IGxpc3RzLiBUaGUgcmVzdWx0cyBhcyBhIHdob2xlIG1ha2Ugc2Vuc2UgYXMgaW4gdGhlIHBhcGVyIHRoZXJlIHdhcyB1c2UgYW5kIG1lbnRpb24gb2YgYWxsIHRoZXNlIGRhdGFiYXNlcy4gQXMgc3RhdGVkIGluIHRoZSBiYWNrZ3JvdW5kIG9mIHRoaXMgcGFwZXIsIENSSCsgY2VsbHMgYXJlIGltcGFpcmVkIGluIHBlcnNvbnMgd2l0aCBNREQsIGFuZCBub3QgaW4gdGhlIGNvbnRyb2wgZ3JvdXAuIFNpbmNlIHRoZXJlIGFyZSBhIG51bWJlciBvZiBwYXRod2F5cywgZnVuY3Rpb25zIGFuZCBjZWxsdWxhciBjb21wb25lbnRzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gY29ydGlzb2wsIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdGhhdCB3ZSB3b3VsZCBzZWUgaGl0cyBvbiB0aGVzZSBkYXRhYmFzZXMgZm9yIGdlbmVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlc2UgZnVuY3Rpb25zLiBJIHdvdWxkIGFsc28gbGlrZSB0byBub3RlLCB0aGF0IGR1ZSB0byBpdCBiZWluZyByZWxhdGVkIHRvIHByb3RlaW5zLCBhbmQgaG93IHByb3RlaW5zIGFyZSBpbXBlcmF0aXZlIGluIGJpb2xvZ2ljYWwgZnVuY3Rpb24gd2Ugc2VlIGEgbG90IG9mIHRoZSBkYXRhYmFzZSBoaXRzIHRoZXJlIHRvby4gSSBpbmNsdWRlZCB0aGUgbGlua3MgdG8gdGhlIHdlYnNpdGUgZm9yIGdwcm9maWxlciBmb3IgZWFjaCBvZiB0aGUgcmVzcGVjdGl2ZSBxdWVyaWVzIGJlY2F1c2UgaXQgaXMgYSBtZWFucyBvZiB2ZXJpZnlpbmcgdGhhdCB0aGUgc3RlcHMgdGFrZW4gdGh1cyBmYXIgYXJlIGNvcnJlY3QuIFNpbmNlLCB3ZSBoYXZlIG5vdCBtYW51YWxseSBmaWx0ZXJlZCB0aGUgdmFsdWVzLCBhcyBJIG9ubHkgdXNlZCB0aGVpciBnZW5lIG5hbWVzLCB0aGUgdGhyZXNob2xkcyBhbmQgbGltaXRhdGlvbnMgZG9uJ3QgZG8gbXVjaC4gQnV0IHRoZSB0cmVuZCBhbmQgb3ZlcmFsIGRpc3BlcnRpb24gb2YgdGhlIHJlc3VsdHMgYXJlIHZlcnkgc2ltaWxhciwgd2hpY2ggaXMgd2h5IEkgd2FudGVkIHRvIGluY2x1ZGUgdGhlbS4KCiMgSW50ZXJwcmV0YXRpb24gYW5kIERpc2N1c3Npb24KVGhlIG1vc3QgaW1wb3J0YW50IGFzcGVjdCBvZiB0aGUgYW5hbHlzaXMgaXMgcmVsYXRpbmcgeW91ciByZXN1bHRzIGJhY2sgdG8gdGhlIGluaXRpYWwgZGF0YSBhbmQgcXVlc3Rpb24uIFxuZXdsaW5lCgoxLiBEbyB0aGUgb3Zlci1yZXByZXNlbnRhdGlvbiByZXN1bHRzIHN1cHBvcnQgY29uY2x1c2lvbnMgb3IgbWVjaGFuaXNtIGRpc2N1c3NlZCBpbiB0aGUgb3JpZ2luYWwgcGFwZXI/IFxuZXdsaW5lCgpZZXMgdGhleSBjb21wbGV0ZWx5IHN1cHBvcnQgdGhlIGNvbmNsdXNpb25zIGluIHRoZSBvcmlnaW5hbCBwYXBlciBieSB0aGUgYXV0aG9ycywoT2gsIEh5dW5qdW5nIGV0IGFsLiwgMjAyMikgYmVjYXVzZSB0aGV5IHRoZW1zZWx2ZXMgYWxzbyBwZXJmb3JtZWQgYSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcyBvZiB0aGUgZ2VuZXMgd2l0aCBzaW1pbGFyIHJlc3VsdHMuIFRoZXkgaGFkIGFuIHRvdGFsIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIG9mIDgzNSBnZW5lcywgd2hlcmVhcyBteSB0b3RhbCB3YXMgNjA4LiBUaGUgcGFwZXIgbWVudGlvbnMgaG93IHRoZXkgdXNlZCBDbHVlR28sIGEgQ3l0b3NjYXBlIHBsdWdpbi4gVGhlIGF1dGhvcnMgb2YgdGhlIHBhcGVyIGlkZW50aWZpZWQgMzA3IGdlbmVzIHNob3dpbmcgc2lnbmlmaWNhbnQgZ3JvdXAgZGlmZmVyZW5jZXMgMTY4IHVwcmVndWxhdGVkLCAxMzkgZG93bnJlZ3VsYXRlZCBhbmQgZ2VuZSBzZXRzIHdlcmUgc2lnbmlmaWNhbnRseSBhbHRlcmVkIGluIHRob3NlIHdpdGggTURELCA1MjggZ2VuZSBzZXRzLCAyNjcgdXByZWd1bGF0ZWQsIDI2MSBkb3ducmVndWxhdGVkLiBUaGVzZSBhcmUgYXJvdW5kIHRoZSBzYW1lIGJhbGxwYXJrIGFzIHRoZSBudW1iZXIgb2YgZ2VuZXMgdGhhdCBJIGhhZCBgciBsZW5ndGgoYWxsdmFsdWVzKWAgZm9yIGFsbCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMsIGByIGxlbmd0aChhbGxfZG93bl9lbnNnKWAgZm9yIGFsbCBkb3duIHJlZ3VsYXRlZCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMsIGByIGxlbmd0aChhbGxfdXBfZW5zKWAgZm9yIGFsbCB1cCByZWd1bGF0ZWQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzLiBXaGljaCBpcyBjbG9zZSB0byB0aGUgdG90YWwgdXByZWd1bGF0ZWQgdG90YWwgb2YgNDM1IGFuZCB0aGUgZG93bnJlZ3VsYXRlZCB0b3RhbCBvZiA0MDAgZm9yIHRoZSBhdXRob3JzLiBOb3csIHRoZXJlIGlzIGEgc2xpZ2h0IHZhcmlhdGlvbiBidXQgSSB0aGluayB0aGF0IG1ha2VzIHNlbnNlIGFzIHRoZSBhdXRob3JzIGhhZCBhIGRpZmZlcmVudCBtZXRob2QgZm9yIGxpbWl0aW5nIGFuZCBjaG9vc2luZyBnZW5lcywgZGlmZmVyZW50IGZyb20gaG93IHdlIHdlcmUgZG9pbmcgaXQgaW4gdGhpcyBhc3NpZ25tZW50LiBUaGUgYXV0aG9ycyBvZiB0aGUgcGFwZXIgdXNlZCBHZW5lIFNldCBFbnJpY2htZW50IEFuYWx5c2lzIChHU0VBKSB3aXRoIHdob2xlIHRyYW5zY3JpcHRvbWljIGRhdGEgdG8gaWRlbnRpZnkgYWx0ZXJlZCBiaW9sb2dpY2FsIHBhdGh3YXlzIGluIHRoZXNlIGludGVybmV1cm9ucy4gQWRkaXRpb25hbGx5IGFzIG1lbnRpb25lZCBpbiBBc3NpZ25tZW50IDEsIHRoZSBhdXRob3JzIG9mIHRoZSBwYXBlciBhbHNvIGhhZCBtb3JlIGdlbmVzIHRoYW4gSSBkaWQgYXQgdGhlIGVuZCBvZiBteSBhbmFseXNpcy4gSSB3b3VsZCBsaWtlIHRvIHBvaW50IG91dCBhZ2FpbiB0aGF0IHRoZXkgZGlkIG5vdCByZW1vdmUgYW55IG91dGxpZXJzLCBvciB1c2VkIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbWV0aG9kIGZvciBkb2luZyBzbywgYnV0IEkgY2Fubm90IGZpbmQgdGhhdCBpbiB0aGUgcGFwZXIgYXMgaXQgaXMgbm90IG1lbnRpb25lZC4gTm90IGluIHRoZSBzYW1lIGNvbnRleHQgdGhhdCBJIHdhcyBsb29raW5nIGZvciBhbnl3YXkuIiBcbmV3bGluZQoKMi4gQ2FuIHlvdSBmaW5kIGV2aWRlbmNlLCBpLmUuIHB1YmxpY2F0aW9ucywgdG8gc3VwcG9ydCBzb21lIG9mIHRoZSByZXN1bHRzIHRoYXQgeW91IHNlZS4gSG93IGRvZXMgdGhpcyBldmlkZW5jZSBzdXBwb3J0IHlvdXIgcmVzdWx0cy4gXG5ld2xpbmUKCkxpbmsgYmV0d2VlbiBnZW5lcyBhbmQgZGVwcmVzc2lvbiBoYXZlIGJlZW4gZm91bmQgb3V0IGluIHRoZSByZWNlbnQgeWVhcnMuIFRoZXJlIGFyZSBtYW55IHBhcGVycyB0aGF0IHN1cHBvcnQgdGhlIG5vdGlvbiBvZiBnZW5lIGV4cHJlc3Npb24gYmVpbmcgdGllZCB0byB0aGUgcmVndWxhdGlvbiBhbmQgd2VsbCBiZWluZyBvZiBtZW50YWwgaGVhbHRoLCBpdCBtYWtlcyBzZW5zZSB0aGlua2luZyBhYm91dCBpdCBmcm9tIGEgcHVyZWx5IHNjaWVudGlmaWMgcGVyc3BlY3RpdmUgYXMgd2VsbC4gRm9yIGluc3RhbmNlLCBldmVyeXRoaW5nIG91ciBib2R5IGRvZXMgb3IgY2FuIGRvLCBpcyBjb2RlZCBieSBmb3IgRE5BLCBhbGwgdGhlIGNoZW1pc3RyeSwgYmVoYXZpb3VycywgaW50ZXJhY3Rpb25zIGJldHdlZW4gY2VsbHVsYXIgcHJvY2Vzc2VzIGFyZSBkdWUgdG8gZ2VuZXMgYW5kIHRoZWlyIGludGVyYXRpb25zLiBTbyBpdCBtYWtlcyBzZW5zZSB0aGF0IGJyYWluIGNoZW1pc3RyeSBhbmQgZGVwZW5kZW5jZSB3b3VsZCBhbHNvIGJlIGRldGVybWluZWQgYnkgZ2VuZXMgYW5kIHRoZWlyIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIG9yIGxhY2sgdGhlcmVvZi4gSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXMgb2YgcHVibGljYXRpb25zIHRoYXQgY2FuIHN1cHBvcnQgdGhlIGlkZWEgdGhhdCB3YXMgcHJlc2VudGVkIGluIHRoaXMgcGFwZXIgYnkgIChIeXVuanVuZyBldC4gYWwuLCAyMDIyKS4gQSBwYXBlciB0aXRsZWQgIlJlZHVjZWQgYnJhaW4gc29tYXRvc3RhdGluIGluIG1vb2QgZGlzb3JkZXJzOiBhIGNvbW1vbiBwYXRob3BoeXNpb2xvZ2ljYWwgc3Vic3RyYXRlIGFuZCBkcnVnIHRhcmdldD8iIChMaW4gZXQuIGFsLiAyMDEzKSBkZXRlcmVtaW5lZCB0aGF0IFNvbWF0aWNhb3N0YXRpbiBpcyBhIG5ldXJvcGVwdGlkZSB0aGF0IGFjdHMgYXMgYW4gaW5oaWJpdG9yeSBtb2R1bGF0b3IgYW5kIGl0IGlzIGNydWNpYWwgaW4gY29ydGljYWwgbG9jYWwgaW5oaWJpdG9yeSBjaXJjdWl0IGFibm9ybWFsaXRpZXMgdGhhdCByZXN1bHQgaW4gYWJlcnJhbnQgY29ydGljb2xpbWJpYyBuZXR3b3JrIGFjdGl2aXR5LiBUaGlzIHNob3dzIHRoYXQgc29tYXRvc3RhdGluLWV4cHJlc3NpbmcgbmV1cm9ucyBoYXZlIGEgdW5pcXVlIGNlbGx1bGFyIHZ1bG5lcmFiaWxpdHkuIFRoaXMgcGFwZXIgYW5kIHRoZSBsaXRlcmF0dXJlIEkgYW0gdXNpbmcgZGVhbHQgd2l0aCBjb3J0aXNvbCByZWd1bGF0aW9uIGVmZmVjdHMuIFNvIGl0IGlzIHByZXR0eSBlYXN5IHRvIHNheSB0aGF0IHRoaXMgZXZpZGVuY2UgZGlyZWN0bHkgc3VwcG9ydHMgbXkgcmVzdWx0cywgc2luY2UgYm90aCBwYXBlcnMgd2VyZSB0cnlpbmcgdG8gZGV0ZXJtaW5lIGNvcnRpY29sIGVmZmVjdHMgb24gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24uIEhlcmUgaXMgYSBzdW1tYXJ5IGFuZCBwYXJhcGhyYXNlIG9mIHRoZWlyIGFic3RyYWN0OyBhbiBpbmhpYml0b3J5IG1vZHVsYXRvcnkgbmV1cm9wZXB0aWRlIGNhbGxlZCBzb21hdGljYW9zdGF0aW4gbWF5IHBsYXkgYSBrZXkgcm9sZSBpbiBjb3J0aWNhbCBsb2NhbCBpbmhpYml0b3J5IGNpcmN1aXQgYWJub3JtYWxpdGllcyB0aGF0IGNvbnRyaWJ1dGUgdG8gYWJlcnJhbnQgY29ydGljb2xpbWJpYyBuZXR3b3JrIGFjdGl2aXR5IGFuZCBjbGluaWNhbCBtb29kIHN5bXB0b21zIGluIGEgdmFyaWV0eSBvZiBuZXVyb2xvZ2ljYWwgaWxsbmVzc2VzLiBBbHRob3VnaCBvdXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgYmlvbG9neSBvZiBhZmZlY3QgZHlzcmVndWxhdGlvbiBoYXMgaW1wcm92ZWQgb3ZlciB0aW1lLCBwaGFybWFjZXV0aWNhbCB0aGVyYXBpZXMgcmVtYWluIGluc3VmZmljaWVudC4gV2UgZm9jdXMgb24gZGlyZWN0IGRhdGEgZnJvbSB0aGUgcG9zdG1vcnRlbSBicmFpbiBvZiBodW1hbnMgYW5kIGV4YW1pbmUgcm9kZW50IGdlbmV0aWMgYW5kIHBoYXJtYWNvbG9naWNhbCByZXNlYXJjaCB0aGF0IGludmVzdGlnYXRlIHRoZSBmdW5jdGlvbiBvZiB0aGUgc29tYXRvc3RhdGluIHN5c3RlbSBpbiBtb29kLiBBbm90aGVyIHBhcGVyIHRpdGxlZCAiUmVkdWNlZCBnbGlhbCBjZWxsIGRlbnNpdHkgYW5kIG5ldXJvbmFsIHNpemUgaW4gdGhlIGFudGVyaW9yIGNpbmd1bGF0ZSBjb3J0ZXggaW4gbWFqb3IgZGVwcmVzc2l2ZSBkaXNvcmRlciIgYnkgKENvdHRlciBldC4gYWwuLCAyMDAxKSBjb25jbHVkZWQgdGhhdCB0aGVyZSBpcyByZWR1Y2VkIGZyb250YWwgY29ydGljYWwgZ2xpYWwgY2VsbCBkZW5zaXR5IGFuZCBuZXVyb25hbCBzaXplIGluIG1ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXIsIHRoZSBkZWNyZWFzZWQgY2VsbCBkZW5zaXR5IHdhcyBkdWUgdG8gZ2VuZSBleHByZXNzaW9uIG9mIGNlcnRhaW4gY2VsbHMgbGlrZSBnbHljZXJhbGRlaHlkZSBwaG9zcGhhdGUgZGVoeWRyb2dlbmFzZSdzIG1lc3NlbmdlciBSTkEgbGV2ZWxzIG9yIHN1YmdlbnVhbCBhbnRlcmlvciBjaW5ndWxhdGUgY29ydGV4IChBQ0MpIGhhdmluZyByZWR1Y2VkIGdpbGlhbCBjZWxsIGRlbnNpdHksIGR1ZSB0byBnbHV0YW1hdGVyZ2ljIHBhdGh3YXlzIHRvIHN1YmNvcnRpY2FsIHN0cnVjdHVyZXMgaGF2aW5nIHJlZ3VsYXRpb24gaXNzdWVzLiBIZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGlzIHBhcGVyJ3MgaWRlYXM7IEdsaWFsIGNlbGxzIG1ha2UgdXAgbW9yZSB0aGFuIGhhbGYgb2YgYWxsIGJyYWluIGNlbGxzIGFuZCBhcmUgYXNzdW1lZCB0byBwbGF5IGEga2V5IHJvbGUgaW4gbWFueSBuZXJ2b3VzIHN5c3RlbSBhY3Rpdml0aWVzLiBHbGlhbCBjZWxsIGR5c2Z1bmN0aW9uIGlzIHRob3VnaHQgdG8gaGF2ZSBhIHJvbGUgaW4gdGhlIHBhdGhvZ2VuZXNpcyBvZiBtYWpvciBtZW50YWwgZGlzZWFzZXMgaW5jbHVkaW5nIE1ERCBhbmQgc2NoaXpvcGhyZW5pYS4gTGFzdGx5IHRoZSBwYXBlciB0aXRsZWQgIkFsdGVyZWQgZXhwcmVzc2lvbiBvZiBnZW5lcyBpbnZvbHZlZCBpbiBpbmZsYW1tYXRpb24gYW5kIGFwb3B0b3NpcyBpbiBmcm9udGFsIGNvcnRleCBpbiBtYWpvciBkZXByZXNzaW9uIiBieSAoU2hlbHRvbiBldC4gYWwuLCAyMDExKSB3aGljaCByZXZlYWxlZCB0aGF0IGRlcHJlc3NlZCBwZW9wbGUgaGF2ZSBoaWdoZXIgbGV2ZWxzIG9mIGluZmxhbW1hdG9yeSBhbmQgYXBvcHRvdGljIHN0cmVzcyBpbiBCQTEwLCBpbmNsdWRpbmcgZWxldmF0ZWQgbGV2ZWxzIG9mIHBhcnRpY3VsYXIgY3l0b2tpbmVzIGFuZCBhbnRpLWFwb3B0b3RpYyBwcm90ZWlucy4gQWx0aG91Z2ggdGhlIGV4YWN0IGNhdXNlcyBvZiB0aGVzZSBhbm9tYWxpZXMgYXJlIHVua25vd24sIG94aWRhdGl2ZSBzdHJlc3MgaGFzIGJlZW4gbGlua2VkIHRvIHRoZW0uIENsZWFybHksIGZ1cnRoZXIgc3R1ZHkgaXMgbmVlZGVkIHRvIGNvbmZpcm0gdGhlc2UgZmluZGluZ3MgYW5kIGV4YW1pbmUgY2F1c2F0aXZlIHBhdGh3YXlzIGluIG1vcmUgZGVwdGguIFRvIHN1bW1hcml6ZSB0aGVpciBhYnN0cmFjdCBhbmQgcGFyYXBocmFzZSB0aGVpciBhYnN0cmFjdDsgdGhlIGNhdXNlIG9mIG1ham9yIGRlcHJlc3Npb24gKE1ERCkgaXMgdW5rbm93bi4gTG9jYWwgaW5mbGFtbWF0b3J5LCBhcG9wdG90aWMsIGFuZCBveGlkYXRpdmUgc3RyZXNzIGFyZSBzZWVuIGluIHBvc3QtbW9ydGVtIGJyYWluIHRpc3N1ZSBzYW1wbGVzIGluIE1ERCBwYXRpZW50cy4gQSBnZW5lIHNldCBhbmFseXNpcyByZXZlYWxlZCB0aGF0IGEgbnVtYmVyIG9mIHByby0gYW5kIGFudGktaW5mbGFtbWF0b3J5IGN5dG9raW5lcyB3ZXJlIHVwcmVndWxhdGVkLiBNZXRhbGxvdGhpb25laW4gMU0gKE1UMU0pLCBhIHppbmMgYmluZGluZyBwcm90ZWluIGludm9sdmVkIGluIHRoZSBjb250cm9sIG9mIG94aWRhdGl2ZSBzdHJlc3MsIHdhcyBvbmUgb2YgdGhlIGdlbmVzIHdpdGggbG93ZXIgZXhwcmVzc2lvbi4gU28sIHRvIHJlaXRlcmF0ZSwgdGhlcmUgaXMgYSBzdHJvbmcgcmVsYXRpb25zaGlwIGJldHdlZW4gc29tZSBnZW5lcyBhbmQgdGhlaXIgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5kIHBhdGh3YXlzIGJlaW5nIGluY29ycmVjdGx5IHJlZ3VsYXRlZC4gVGhpcyBjYW4gbGVhZCB0byBpbmRpdmlkdWFscyBzdWZmZXJpbmcgZnJvbSBNREQgb3Igb3RoZXIgaWxsbmVzc2VzIHRoYXQgYWZmZWN0IHRoZSBxdWFsaXR5IG9mIGxpZmUuIEJvdGggbXkgYXNzaWdubWVudCwgYW5kIHBhcGVyIGhhdmUgY29uY2x1ZGVkIHRoYXQgdGhlcmUgaXMgYSBzdHJvbmcgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gaW4gdGhlc2UgMTIgc2FtcGxlcyB3aXRoIHNvbWUgb2YgdGhlIG1vcmUgbWFqb3IgZ2VuZXMgYmVpbmcgaGlnaGxpZ2h0ZWQgaW4gdGhlIHBsb3RzIGFuZCBmaWd1cmVzIGFib3ZlLiAKCiMgTGluayB0byBKb3VybmFsCltDbGljayBNZSFdKGh0dHBzOi8vZ2l0aHViLmNvbS9iY2I0MjAtMjAyMi9TYWJiaXJfSG9zc2Fpbi93aWtpL0pvdXJuYWwtRW50cnktQXNzaWdubWVudC0lMjMyOi0tRGlmZmVyZW50aWFsLUdlbmUtZXhwcmVzc2lvbi1hbmQtUHJlbGltaW5hcnktT1JBKQoKCiMgQ2l0YXRpb25zCgoxLiBCb25uaW4sIFMuICgyMDIyKS4gMTkuMTEgVm9sY2FubyBwbG90cyB8IEludHJvZHVjdGlvbiB0byBSLiBCaW9jb3JlY3JnLmdpdGh1Yi5pby4gUmV0cmlldmVkIDEzIEFwcmlsIDIwMjIsIGZyb20gaHR0cHM6Ly9iaW9jb3JlY3JnLmdpdGh1Yi5pby9DUkdfUkludHJvZHVjdGlvbi92b2xjYW5vLXBsb3RzLmh0bWwuCgoyLiBDb3R0ZXIsIEQuLCBNYWNrYXksIEQuLCBMYW5kYXUsIFMuLCBLZXJ3aW4sIFIuLCAmIEV2ZXJhbGwsIEkuICgyMDAxKS4gUmVkdWNlZCBHbGlhbCBDZWxsIERlbnNpdHkgYW5kIE5ldXJvbmFsIFNpemUgaW4gdGhlIEFudGVyaW9yIENpbmd1bGF0ZSBDb3J0ZXggaW4gTWFqb3IgRGVwcmVzc2l2ZSBEaXNvcmRlci4gQXJjaGl2ZXMgT2YgR2VuZXJhbCBQc3ljaGlhdHJ5LCA1OCg2KSwgNTQ1LiBodHRwczovL2RvaS5vcmcvMTAuMTAwMS9hcmNocHN5Yy41OC42LjU0NQoKMy4gRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gd2l0aCBMaW1tYS1Wb29tLiBVY2RhdmlzLWJpb2luZm9ybWF0aWNzLXRyYWluaW5nLmdpdGh1Yi5pby4gKDIwMjIpLiBSZXRyaWV2ZWQgMTMgQXByaWwgMjAyMiwgZnJvbSBodHRwczovL3VjZGF2aXMtYmlvaW5mb3JtYXRpY3MtdHJhaW5pbmcuZ2l0aHViLmlvLzIwMTgtSnVuZS1STkEtU2VxLVdvcmtzaG9wL3RodXJzZGF5L0RFLmh0bWwuCgo0LiBEdWFuLCBFLiAoMjAyMikuIFJ8UHkgbm90ZXM6IFZvbGNhbm8gcGxvdHMgd2l0aCBnZ3Bsb3QyLiBSfFB5IG5vdGVzLiBSZXRyaWV2ZWQgMTMgQXByaWwgMjAyMiwgZnJvbSBodHRwczovL2VyaWthZHVhbi5naXRodWIuaW8vcG9zdHMvMjAyMS0wMS0wMi12b2xjYW5vLXBsb3RzLXdpdGgtZ2dwbG90Mi8uCgo1LiBGYWxjb24sIFMuLCAmIEdlbnRsZW1hbiwgUi4gKDIwMDYpLiBVc2luZyBHT3N0YXRzIHRvIHRlc3QgZ2VuZSBsaXN0cyBmb3IgR08gdGVybSBhc3NvY2lhdGlvbi4gQmlvaW5mb3JtYXRpY3MsIDIzKDIpLCAyNTctMjU4LiBodHRwczovL2RvaS5vcmcvMTAuMTA5My9iaW9pbmZvcm1hdGljcy9idGw1NjcKCjYuIEdlaXN0bGluZ2VyLCBMLiwgQ3NhYmEsIEcuLCBTYW50YXJlbGxpLCBNLiwgUmFtb3MsIE0uLCBTY2hpZmZlciwgTC4sIFR1cmFnYSwgTi4sIExhdywgQy4sIERhdmlzLCBTLiwgQ2FyZXksIFYuLCBNb3JnYW4sIE0uLCBaaW1tZXIsIFIuLCAmIFdhbGRyb24sIEwuICgyMDIxKS4gVG93YXJkIGEgZ29sZCBzdGFuZGFyZCBmb3IgYmVuY2htYXJraW5nIGdlbmUgc2V0IGVucmljaG1lbnQgYW5hbHlzaXMuIEJyaWVmaW5ncyBpbiBiaW9pbmZvcm1hdGljcywgMjIoMSksIDU0NeKAkzU1Ni4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvYmliL2JiejE1OAoKNy4gSHVhbmcsIEQuLCBTaGVybWFuLCBCLiwgJiBMZW1waWNraSwgUi4gKDIwMDgpLiBCaW9pbmZvcm1hdGljcyBlbnJpY2htZW50IHRvb2xzOiBwYXRocyB0b3dhcmQgdGhlIGNvbXByZWhlbnNpdmUgZnVuY3Rpb25hbCBhbmFseXNpcyBvZiBsYXJnZSBnZW5lIGxpc3RzLiBOdWNsZWljIEFjaWRzIFJlc2VhcmNoLCAzNygxKSwgMS0xMy4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvbmFyL2drbjkyMwoKOC4gTGluLCBMLiwgJiBTaWJpbGxlLCBFLiAoMjAxMykuIFJlZHVjZWQgYnJhaW4gc29tYXRvc3RhdGluIGluIG1vb2QgZGlzb3JkZXJzOiBhIGNvbW1vbiBwYXRob3BoeXNpb2xvZ2ljYWwgc3Vic3RyYXRlIGFuZCBkcnVnIHRhcmdldD8uIEZyb250aWVycyBJbiBQaGFybWFjb2xvZ3ksIDQuIGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2ZwaGFyLjIwMTMuMDAxMTAKCjkuIE9oLCBILiwgTmV3dG9uLCBELiwgTGV3aXMsIEQuLCAmIFNpYmlsbGUsIEUuICgyMDIyKS4gTG93ZXIgTGV2ZWxzIG9mIEdBQkFlcmdpYyBGdW5jdGlvbiBNYXJrZXJzIGluIENvcnRpY290cm9waW4tUmVsZWFzaW5nIEhvcm1vbmUtRXhwcmVzc2luZyBOZXVyb25zIGluIHRoZSBzZ0FDQyBvZiBIdW1hbiBTdWJqZWN0cyBXaXRoIERlcHJlc3Npb24uIEZyb250aWVycyBJbiBQc3ljaGlhdHJ5LCAxMy4gaHR0cHM6Ly9kb2kub3JnLzEwLjMzODkvZnBzeXQuMjAyMi44Mjc5NzIKCjEwLiBQZW5nLCBSLiAoMjAyMikuIFIgUHJvZ3JhbW1pbmcgZm9yIERhdGEgU2NpZW5jZS4gQm9va2Rvd24ub3JnLiBSZXRyaWV2ZWQgMTMgQXByaWwgMjAyMiwgZnJvbSBodHRwczovL2Jvb2tkb3duLm9yZy9yZHBlbmcvcnByb2dkYXRhc2NpZW5jZS8uCgoxMS4gU2hlbHRvbiwgUi4sIENsYWlib3JuZSwgSi4sIFNpZG9yeWstV2Vncnp5bm93aWN6LCBNLiwgUmVkZHksIFIuLCBBc2NobmVyLCBNLiwgTGV3aXMsIEQuLCAmIE1pcm5pY3MsIEsuICgyMDEwKS4gQWx0ZXJlZCBleHByZXNzaW9uIG9mIGdlbmVzIGludm9sdmVkIGluIGluZmxhbW1hdGlvbiBhbmQgYXBvcHRvc2lzIGluIGZyb250YWwgY29ydGV4IGluIG1ham9yIGRlcHJlc3Npb24uIE1vbGVjdWxhciBQc3ljaGlhdHJ5LCAxNig3KSwgNzUxLTc2Mi4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbXAuMjAxMC41MgoKMTIuIFN0ZWlwZSwgQi4sICYgSXNzZXJsaW4sIFIuICgyMDIyKS4gQkNCNDIwIC0gQ29tcHV0YXRpb25hbCBTeXN0ZW0gQmlvbG9neS4gQmNiNDIwLTIwMjIuZ2l0aHViLmlvLiBSZXRyaWV2ZWQgMTMgQXByaWwgMjAyMiwgZnJvbSBodHRwczovL2JjYjQyMC0yMDIyLmdpdGh1Yi5pby9HZW5lcmFsX2NvdXJzZV9wcmVwL2luZGV4Lmh0bWwjYXR0cmlidXRpb25zLgoKMTMuIFN0ZWlwZSwgQi4sICYgSXNzZXJsaW4sIFIuICgyMDIyKS4gQkNCNDIwIC0gQ29tcHV0YXRpb25hbCBTeXN0ZW0gQmlvbG9neS4gQmNiNDIwLTIwMjIuZ2l0aHViLmlvLiBSZXRyaWV2ZWQgMTMgQXByaWwgMjAyMiwgZnJvbSBodHRwczovL2JjYjQyMC0yMDIyLmdpdGh1Yi5pby9SX2Jhc2ljcy8uCgoxNC4gU3RlaXBlLCBCLiwgJiBJc3NlcmxpbiwgUi4gKDIwMjIpLiBCQ0I0MjAgLSBDb21wdXRhdGlvbmFsIFN5c3RlbSBCaW9sb2d5LiBCY2I0MjAtMjAyMi5naXRodWIuaW8uIFJldHJpZXZlZCAxMyBBcHJpbCAyMDIyLCBmcm9tIGh0dHBzOi8vYmNiNDIwLTIwMjIuZ2l0aHViLmlvL0Jpb2luZm9fQmFzaWNzLy4KCjE1LiBMZWN0dXJlIG1vZHVsZXM6IGh0dHBzOi8vcS51dG9yb250by5jYS9jb3Vyc2VzLzI0ODQ1NS9tb2R1bGVzCgoxNi4gVWt1IFJhdWR2ZXJlLCBMaWlzIEtvbGJlcmcsIEl2YW4gS3V6bWluLCBUYW1iZXQgQXJhaywgUHJpaXQgQWRsZXIsIEhlZGkgUGV0ZXJzb24sIEphYWsgVmlsbzogZzpQcm9maWxlcjogYSB3ZWIgc2VydmVyIGZvciBmdW5jdGlvbmFsIGVucmljaG1lbnQgYW5hbHlzaXMgYW5kIGNvbnZlcnNpb25zIG9mIGdlbmUgbGlzdHMgKDIwMTkgdXBkYXRlKSBOdWNsZWljIEFjaWRzIFJlc2VhcmNoIDIwMTk7IGRvaToxMC4xMDkzL25hci9na3ozNjkgW1BERl0uCgpgYGB7UiBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB9CmNpdGF0aW9uKCJ0aWR5dmVyc2UiKQpjaXRhdGlvbigiZWRnZVIiKQpjaXRhdGlvbigiR0VPbWV0YWRiIikKY2l0YXRpb24oIlJDb2xvckJyZXdlciIpCmNpdGF0aW9uKCJnZ3Bsb3QyIikKY2l0YXRpb24oInJlYWR4bCIpCmNpdGF0aW9uKCJkcGx5ciIpCmNpdGF0aW9uKCJBbm5vdGF0aW9uRGJpIikKY2l0YXRpb24oImxpbW1hIikKY2l0YXRpb24oIkJpb2Jhc2UiKQpjaXRhdGlvbigiQmlvY01hbmFnZXIiKQpjaXRhdGlvbigiYmlvbWFSdCIpCmNpdGF0aW9uKCJtYWdyaXR0ciIpCmNpdGF0aW9uKCJHRU9xdWVyeSIpCmNpdGF0aW9uKCJSU1FMaXRlIikKY2l0YXRpb24oImxpbW1hIikKY2l0YXRpb24oIm9yZy5Icy5lZy5kYiIpCmNpdGF0aW9uKCd1bWFwJykKY2l0YXRpb24oInZlZ2FuIikKY2l0YXRpb24oJ2dwcm9maWxlcjInKQpjaXRhdGlvbignZ2dyZXBlbCcpCmBgYAo8ZGl2IGNsYXNzPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIGRhdGEtdW5pcXVlPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIHN0eWxlPSJoZWlnaHQ6IDA7Ij48L2Rpdj4=